home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 98 / Skunkware 98.iso / src / interp / perl5.005.tar.gz / perl5.005.tar / perl5.005 / sv.c < prev    next >
C/C++ Source or Header  |  1998-07-21  |  109KB  |  5,135 lines

  1. /*    sv.c
  2.  *
  3.  *    Copyright (c) 1991-1997, Larry Wall
  4.  *
  5.  *    You may distribute under the terms of either the GNU General Public
  6.  *    License or the Artistic License, as specified in the README file.
  7.  *
  8.  */
  9.  
  10. /*
  11.  * "I wonder what the Entish is for 'yes' and 'no'," he thought.
  12.  */
  13.  
  14. #include "EXTERN.h"
  15. #include "perl.h"
  16.  
  17. #ifdef OVR_DBL_DIG
  18. /* Use an overridden DBL_DIG */
  19. # ifdef DBL_DIG
  20. #  undef DBL_DIG
  21. # endif
  22. # define DBL_DIG OVR_DBL_DIG
  23. #else
  24. /* The following is all to get DBL_DIG, in order to pick a nice
  25.    default value for printing floating point numbers in Gconvert.
  26.    (see config.h)
  27. */
  28. #ifdef I_LIMITS
  29. #include <limits.h>
  30. #endif
  31. #ifdef I_FLOAT
  32. #include <float.h>
  33. #endif
  34. #ifndef HAS_DBL_DIG
  35. #define DBL_DIG    15   /* A guess that works lots of places */
  36. #endif
  37. #endif
  38.  
  39. #if defined(USE_STDIO_PTR) && defined(STDIO_PTR_LVALUE) && defined(STDIO_CNT_LVALUE) && !defined(__QNX__)
  40. #  define FAST_SV_GETS
  41. #endif
  42.  
  43. #ifdef PERL_OBJECT
  44. #define FCALL this->*f
  45. #define VTBL this->*vtbl
  46.  
  47. #else /* !PERL_OBJECT */
  48.  
  49. static IV asIV _((SV* sv));
  50. static UV asUV _((SV* sv));
  51. static SV *more_sv _((void));
  52. static XPVIV *more_xiv _((void));
  53. static XPVNV *more_xnv _((void));
  54. static XPV *more_xpv _((void));
  55. static XRV *more_xrv _((void));
  56. static XPVIV *new_xiv _((void));
  57. static XPVNV *new_xnv _((void));
  58. static XPV *new_xpv _((void));
  59. static XRV *new_xrv _((void));
  60. static void del_xiv _((XPVIV* p));
  61. static void del_xnv _((XPVNV* p));
  62. static void del_xpv _((XPV* p));
  63. static void del_xrv _((XRV* p));
  64. static void sv_mortalgrow _((void));
  65. static void sv_unglob _((SV* sv));
  66. static void sv_check_thinkfirst _((SV *sv));
  67.  
  68. #ifndef PURIFY
  69. static void *my_safemalloc(MEM_SIZE size);
  70. #endif
  71.  
  72. typedef void (*SVFUNC) _((SV*));
  73. #define VTBL *vtbl
  74. #define FCALL *f
  75.  
  76. #endif /* PERL_OBJECT */
  77.  
  78. #define SV_CHECK_THINKFIRST(sv) if (SvTHINKFIRST(sv)) sv_check_thinkfirst(sv)
  79.  
  80. #ifdef PURIFY
  81.  
  82. #define new_SV(p)            \
  83.     do {                \
  84.     LOCK_SV_MUTEX;            \
  85.     (p) = (SV*)safemalloc(sizeof(SV)); \
  86.     reg_add(p);            \
  87.     UNLOCK_SV_MUTEX;        \
  88.     } while (0)
  89.  
  90. #define del_SV(p)            \
  91.     do {                \
  92.     LOCK_SV_MUTEX;            \
  93.     reg_remove(p);            \
  94.         Safefree((char*)(p));        \
  95.     UNLOCK_SV_MUTEX;        \
  96.     } while (0)
  97.  
  98. static SV **registry;
  99. static I32 registry_size;
  100.  
  101. #define REGHASH(sv,size)  ((((U32)(sv)) >> 2) % (size))
  102.  
  103. #define REG_REPLACE(sv,a,b) \
  104.     do {                \
  105.     void* p = sv->sv_any;        \
  106.     I32 h = REGHASH(sv, registry_size);    \
  107.     I32 i = h;            \
  108.     while (registry[i] != (a)) {    \
  109.         if (++i >= registry_size)    \
  110.         i = 0;            \
  111.         if (i == h)            \
  112.         die("SV registry bug");    \
  113.     }                \
  114.     registry[i] = (b);        \
  115.     } while (0)
  116.  
  117. #define REG_ADD(sv)    REG_REPLACE(sv,Nullsv,sv)
  118. #define REG_REMOVE(sv)    REG_REPLACE(sv,sv,Nullsv)
  119.  
  120. static void
  121. reg_add(sv)
  122. SV* sv;
  123. {
  124.     if (PL_sv_count >= (registry_size >> 1))
  125.     {
  126.     SV **oldreg = registry;
  127.     I32 oldsize = registry_size;
  128.  
  129.     registry_size = registry_size ? ((registry_size << 2) + 1) : 2037;
  130.     Newz(707, registry, registry_size, SV*);
  131.  
  132.     if (oldreg) {
  133.         I32 i;
  134.  
  135.         for (i = 0; i < oldsize; ++i) {
  136.         SV* oldsv = oldreg[i];
  137.         if (oldsv)
  138.             REG_ADD(oldsv);
  139.         }
  140.         Safefree(oldreg);
  141.     }
  142.     }
  143.  
  144.     REG_ADD(sv);
  145.     ++PL_sv_count;
  146. }
  147.  
  148. static void
  149. reg_remove(sv)
  150. SV* sv;
  151. {
  152.     REG_REMOVE(sv);
  153.     --PL_sv_count;
  154. }
  155.  
  156. static void
  157. visit(f)
  158. SVFUNC f;
  159. {
  160.     I32 i;
  161.  
  162.     for (i = 0; i < registry_size; ++i) {
  163.     SV* sv = registry[i];
  164.     if (sv && SvTYPE(sv) != SVTYPEMASK)
  165.         (*f)(sv);
  166.     }
  167. }
  168.  
  169. void
  170. sv_add_arena(ptr, size, flags)
  171. char* ptr;
  172. U32 size;
  173. U32 flags;
  174. {
  175.     if (!(flags & SVf_FAKE))
  176.     Safefree(ptr);
  177. }
  178.  
  179. #else /* ! PURIFY */
  180.  
  181. /*
  182.  * "A time to plant, and a time to uproot what was planted..."
  183.  */
  184.  
  185. #define plant_SV(p)            \
  186.     do {                \
  187.     SvANY(p) = (void *)PL_sv_root;    \
  188.     SvFLAGS(p) = SVTYPEMASK;    \
  189.     PL_sv_root = (p);            \
  190.     --PL_sv_count;            \
  191.     } while (0)
  192.  
  193. /* sv_mutex must be held while calling uproot_SV() */
  194. #define uproot_SV(p)            \
  195.     do {                \
  196.     (p) = PL_sv_root;            \
  197.     PL_sv_root = (SV*)SvANY(p);    \
  198.     ++PL_sv_count;            \
  199.     } while (0)
  200.  
  201. #define new_SV(p)    do {    \
  202.     LOCK_SV_MUTEX;        \
  203.     if (PL_sv_root)        \
  204.         uproot_SV(p);    \
  205.     else            \
  206.         (p) = more_sv();    \
  207.     UNLOCK_SV_MUTEX;    \
  208.     } while (0)
  209.  
  210. #ifdef DEBUGGING
  211.  
  212. #define del_SV(p)    do {    \
  213.     LOCK_SV_MUTEX;        \
  214.     if (PL_debug & 32768)    \
  215.         del_sv(p);        \
  216.     else            \
  217.         plant_SV(p);    \
  218.     UNLOCK_SV_MUTEX;    \
  219.     } while (0)
  220.  
  221. STATIC void
  222. del_sv(SV *p)
  223. {
  224.     if (PL_debug & 32768) {
  225.     SV* sva;
  226.     SV* sv;
  227.     SV* svend;
  228.     int ok = 0;
  229.     for (sva = PL_sv_arenaroot; sva; sva = (SV *) SvANY(sva)) {
  230.         sv = sva + 1;
  231.         svend = &sva[SvREFCNT(sva)];
  232.         if (p >= sv && p < svend)
  233.         ok = 1;
  234.     }
  235.     if (!ok) {
  236.         warn("Attempt to free non-arena SV: 0x%lx", (unsigned long)p);
  237.         return;
  238.     }
  239.     }
  240.     plant_SV(p);
  241. }
  242.  
  243. #else /* ! DEBUGGING */
  244.  
  245. #define del_SV(p)   plant_SV(p)
  246.  
  247. #endif /* DEBUGGING */
  248.  
  249. void
  250. sv_add_arena(char *ptr, U32 size, U32 flags)
  251. {
  252.     SV* sva = (SV*)ptr;
  253.     register SV* sv;
  254.     register SV* svend;
  255.     Zero(sva, size, char);
  256.  
  257.     /* The first SV in an arena isn't an SV. */
  258.     SvANY(sva) = (void *) PL_sv_arenaroot;        /* ptr to next arena */
  259.     SvREFCNT(sva) = size / sizeof(SV);        /* number of SV slots */
  260.     SvFLAGS(sva) = flags;            /* FAKE if not to be freed */
  261.  
  262.     PL_sv_arenaroot = sva;
  263.     PL_sv_root = sva + 1;
  264.  
  265.     svend = &sva[SvREFCNT(sva) - 1];
  266.     sv = sva + 1;
  267.     while (sv < svend) {
  268.     SvANY(sv) = (void *)(SV*)(sv + 1);
  269.     SvFLAGS(sv) = SVTYPEMASK;
  270.     sv++;
  271.     }
  272.     SvANY(sv) = 0;
  273.     SvFLAGS(sv) = SVTYPEMASK;
  274. }
  275.  
  276. /* sv_mutex must be held while calling more_sv() */
  277. STATIC SV*
  278. more_sv(void)
  279. {
  280.     register SV* sv;
  281.  
  282.     if (PL_nice_chunk) {
  283.     sv_add_arena(PL_nice_chunk, PL_nice_chunk_size, 0);
  284.     PL_nice_chunk = Nullch;
  285.     }
  286.     else {
  287.     char *chunk;                /* must use New here to match call to */
  288.     New(704,chunk,1008,char);   /* Safefree() in sv_free_arenas()     */
  289.     sv_add_arena(chunk, 1008, 0);
  290.     }
  291.     uproot_SV(sv);
  292.     return sv;
  293. }
  294.  
  295. STATIC void
  296. visit(SVFUNC f)
  297. {
  298.     SV* sva;
  299.     SV* sv;
  300.     register SV* svend;
  301.  
  302.     for (sva = PL_sv_arenaroot; sva; sva = (SV*)SvANY(sva)) {
  303.     svend = &sva[SvREFCNT(sva)];
  304.     for (sv = sva + 1; sv < svend; ++sv) {
  305.         if (SvTYPE(sv) != SVTYPEMASK)
  306.         (FCALL)(sv);
  307.     }
  308.     }
  309. }
  310.  
  311. #endif /* PURIFY */
  312.  
  313. STATIC void
  314. do_report_used(SV *sv)
  315. {
  316.     if (SvTYPE(sv) != SVTYPEMASK) {
  317.     /* XXX Perhaps this ought to go to Perl_debug_log, if DEBUGGING. */
  318.     PerlIO_printf(PerlIO_stderr(), "****\n");
  319.     sv_dump(sv);
  320.     }
  321. }
  322.  
  323. void
  324. sv_report_used(void)
  325. {
  326.     visit(FUNC_NAME_TO_PTR(do_report_used));
  327. }
  328.  
  329. STATIC void
  330. do_clean_objs(SV *sv)
  331. {
  332.     SV* rv;
  333.  
  334.     if (SvROK(sv) && SvOBJECT(rv = SvRV(sv))) {
  335.     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning object ref:\n "), sv_dump(sv));)
  336.     SvROK_off(sv);
  337.     SvRV(sv) = 0;
  338.     SvREFCNT_dec(rv);
  339.     }
  340.  
  341.     /* XXX Might want to check arrays, etc. */
  342. }
  343.  
  344. #ifndef DISABLE_DESTRUCTOR_KLUDGE
  345. STATIC void
  346. do_clean_named_objs(SV *sv)
  347. {
  348.     if (SvTYPE(sv) == SVt_PVGV) {
  349.     if ( SvOBJECT(GvSV(sv)) ||
  350.          GvAV(sv) && SvOBJECT(GvAV(sv)) ||
  351.          GvHV(sv) && SvOBJECT(GvHV(sv)) ||
  352.          GvIO(sv) && SvOBJECT(GvIO(sv)) ||
  353.          GvCV(sv) && SvOBJECT(GvCV(sv)) )
  354.     {
  355.         DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning named glob object:\n "), sv_dump(sv));)
  356.         SvREFCNT_dec(sv);
  357.     }
  358.     }
  359. }
  360. #endif
  361.  
  362. void
  363. sv_clean_objs(void)
  364. {
  365.     PL_in_clean_objs = TRUE;
  366.     visit(FUNC_NAME_TO_PTR(do_clean_objs));
  367. #ifndef DISABLE_DESTRUCTOR_KLUDGE
  368.     /* some barnacles may yet remain, clinging to typeglobs */
  369.     visit(FUNC_NAME_TO_PTR(do_clean_named_objs));
  370. #endif
  371.     PL_in_clean_objs = FALSE;
  372. }
  373.  
  374. STATIC void
  375. do_clean_all(SV *sv)
  376. {
  377.     DEBUG_D((PerlIO_printf(Perl_debug_log, "Cleaning loops: SV at 0x%lx\n", sv) );)
  378.     SvFLAGS(sv) |= SVf_BREAK;
  379.     SvREFCNT_dec(sv);
  380. }
  381.  
  382. void
  383. sv_clean_all(void)
  384. {
  385.     PL_in_clean_all = TRUE;
  386.     visit(FUNC_NAME_TO_PTR(do_clean_all));
  387.     PL_in_clean_all = FALSE;
  388. }
  389.  
  390. void
  391. sv_free_arenas(void)
  392. {
  393.     SV* sva;
  394.     SV* svanext;
  395.  
  396.     /* Free arenas here, but be careful about fake ones.  (We assume
  397.        contiguity of the fake ones with the corresponding real ones.) */
  398.  
  399.     for (sva = PL_sv_arenaroot; sva; sva = svanext) {
  400.     svanext = (SV*) SvANY(sva);
  401.     while (svanext && SvFAKE(svanext))
  402.         svanext = (SV*) SvANY(svanext);
  403.  
  404.     if (!SvFAKE(sva))
  405.         Safefree((void *)sva);
  406.     }
  407.  
  408.     if (PL_nice_chunk)
  409.     Safefree(PL_nice_chunk);
  410.     PL_nice_chunk = Nullch;
  411.     PL_nice_chunk_size = 0;
  412.     PL_sv_arenaroot = 0;
  413.     PL_sv_root = 0;
  414. }
  415.  
  416. STATIC XPVIV*
  417. new_xiv(void)
  418. {
  419.     IV* xiv;
  420.     if (PL_xiv_root) {
  421.     xiv = PL_xiv_root;
  422.     /*
  423.      * See comment in more_xiv() -- RAM.
  424.      */
  425.     PL_xiv_root = *(IV**)xiv;
  426.     return (XPVIV*)((char*)xiv - STRUCT_OFFSET(XPVIV, xiv_iv));
  427.     }
  428.     return more_xiv();
  429. }
  430.  
  431. STATIC void
  432. del_xiv(XPVIV *p)
  433. {
  434.     IV* xiv = (IV*)((char*)(p) + STRUCT_OFFSET(XPVIV, xiv_iv));
  435.     *(IV**)xiv = PL_xiv_root;
  436.     PL_xiv_root = xiv;
  437. }
  438.  
  439. STATIC XPVIV*
  440. more_xiv(void)
  441. {
  442.     register IV* xiv;
  443.     register IV* xivend;
  444.     XPV* ptr;
  445.     New(705, ptr, 1008/sizeof(XPV), XPV);
  446.     ptr->xpv_pv = (char*)PL_xiv_arenaroot;        /* linked list of xiv arenas */
  447.     PL_xiv_arenaroot = ptr;            /* to keep Purify happy */
  448.  
  449.     xiv = (IV*) ptr;
  450.     xivend = &xiv[1008 / sizeof(IV) - 1];
  451.     xiv += (sizeof(XPV) - 1) / sizeof(IV) + 1;   /* fudge by size of XPV */
  452.     PL_xiv_root = xiv;
  453.     while (xiv < xivend) {
  454.     *(IV**)xiv = (IV *)(xiv + 1);
  455.     xiv++;
  456.     }
  457.     *(IV**)xiv = 0;
  458.     return new_xiv();
  459. }
  460.  
  461. STATIC XPVNV*
  462. new_xnv(void)
  463. {
  464.     double* xnv;
  465.     if (PL_xnv_root) {
  466.     xnv = PL_xnv_root;
  467.     PL_xnv_root = *(double**)xnv;
  468.     return (XPVNV*)((char*)xnv - STRUCT_OFFSET(XPVNV, xnv_nv));
  469.     }
  470.     return more_xnv();
  471. }
  472.  
  473. STATIC void
  474. del_xnv(XPVNV *p)
  475. {
  476.     double* xnv = (double*)((char*)(p) + STRUCT_OFFSET(XPVNV, xnv_nv));
  477.     *(double**)xnv = PL_xnv_root;
  478.     PL_xnv_root = xnv;
  479. }
  480.  
  481. STATIC XPVNV*
  482. more_xnv(void)
  483. {
  484.     register double* xnv;
  485.     register double* xnvend;
  486.     New(711, xnv, 1008/sizeof(double), double);
  487.     xnvend = &xnv[1008 / sizeof(double) - 1];
  488.     xnv += (sizeof(XPVIV) - 1) / sizeof(double) + 1; /* fudge by sizeof XPVIV */
  489.     PL_xnv_root = xnv;
  490.     while (xnv < xnvend) {
  491.     *(double**)xnv = (double*)(xnv + 1);
  492.     xnv++;
  493.     }
  494.     *(double**)xnv = 0;
  495.     return new_xnv();
  496. }
  497.  
  498. STATIC XRV*
  499. new_xrv(void)
  500. {
  501.     XRV* xrv;
  502.     if (PL_xrv_root) {
  503.     xrv = PL_xrv_root;
  504.     PL_xrv_root = (XRV*)xrv->xrv_rv;
  505.     return xrv;
  506.     }
  507.     return more_xrv();
  508. }
  509.  
  510. STATIC void
  511. del_xrv(XRV *p)
  512. {
  513.     p->xrv_rv = (SV*)PL_xrv_root;
  514.     PL_xrv_root = p;
  515. }
  516.  
  517. STATIC XRV*
  518. more_xrv(void)
  519. {
  520.     register XRV* xrv;
  521.     register XRV* xrvend;
  522.     New(712, PL_xrv_root, 1008/sizeof(XRV), XRV);
  523.     xrv = PL_xrv_root;
  524.     xrvend = &xrv[1008 / sizeof(XRV) - 1];
  525.     while (xrv < xrvend) {
  526.     xrv->xrv_rv = (SV*)(xrv + 1);
  527.     xrv++;
  528.     }
  529.     xrv->xrv_rv = 0;
  530.     return new_xrv();
  531. }
  532.  
  533. STATIC XPV*
  534. new_xpv(void)
  535. {
  536.     XPV* xpv;
  537.     if (PL_xpv_root) {
  538.     xpv = PL_xpv_root;
  539.     PL_xpv_root = (XPV*)xpv->xpv_pv;
  540.     return xpv;
  541.     }
  542.     return more_xpv();
  543. }
  544.  
  545. STATIC void
  546. del_xpv(XPV *p)
  547. {
  548.     p->xpv_pv = (char*)PL_xpv_root;
  549.     PL_xpv_root = p;
  550. }
  551.  
  552. STATIC XPV*
  553. more_xpv(void)
  554. {
  555.     register XPV* xpv;
  556.     register XPV* xpvend;
  557.     New(713, PL_xpv_root, 1008/sizeof(XPV), XPV);
  558.     xpv = PL_xpv_root;
  559.     xpvend = &xpv[1008 / sizeof(XPV) - 1];
  560.     while (xpv < xpvend) {
  561.     xpv->xpv_pv = (char*)(xpv + 1);
  562.     xpv++;
  563.     }
  564.     xpv->xpv_pv = 0;
  565.     return new_xpv();
  566. }
  567.  
  568. #ifdef PURIFY
  569. #define new_XIV() (void*)safemalloc(sizeof(XPVIV))
  570. #define del_XIV(p) Safefree((char*)p)
  571. #else
  572. #define new_XIV() (void*)new_xiv()
  573. #define del_XIV(p) del_xiv((XPVIV*) p)
  574. #endif
  575.  
  576. #ifdef PURIFY
  577. #define new_XNV() (void*)safemalloc(sizeof(XPVNV))
  578. #define del_XNV(p) Safefree((char*)p)
  579. #else
  580. #define new_XNV() (void*)new_xnv()
  581. #define del_XNV(p) del_xnv((XPVNV*) p)
  582. #endif
  583.  
  584. #ifdef PURIFY
  585. #define new_XRV() (void*)safemalloc(sizeof(XRV))
  586. #define del_XRV(p) Safefree((char*)p)
  587. #else
  588. #define new_XRV() (void*)new_xrv()
  589. #define del_XRV(p) del_xrv((XRV*) p)
  590. #endif
  591.  
  592. #ifdef PURIFY
  593. #define new_XPV() (void*)safemalloc(sizeof(XPV))
  594. #define del_XPV(p) Safefree((char*)p)
  595. #else
  596. #define new_XPV() (void*)new_xpv()
  597. #define del_XPV(p) del_xpv((XPV *)p)
  598. #endif
  599.  
  600. #ifdef PURIFY
  601. #  define my_safemalloc(s) safemalloc(s)
  602. #  define my_safefree(s) free(s)
  603. #else
  604. STATIC void* 
  605. my_safemalloc(MEM_SIZE size)
  606. {
  607.     char *p;
  608.     New(717, p, size, char);
  609.     return (void*)p;
  610. }
  611. #  define my_safefree(s) Safefree(s)
  612. #endif 
  613.  
  614. #define new_XPVIV() (void*)my_safemalloc(sizeof(XPVIV))
  615. #define del_XPVIV(p) my_safefree((char*)p)
  616.   
  617. #define new_XPVNV() (void*)my_safemalloc(sizeof(XPVNV))
  618. #define del_XPVNV(p) my_safefree((char*)p)
  619.   
  620. #define new_XPVMG() (void*)my_safemalloc(sizeof(XPVMG))
  621. #define del_XPVMG(p) my_safefree((char*)p)
  622.   
  623. #define new_XPVLV() (void*)my_safemalloc(sizeof(XPVLV))
  624. #define del_XPVLV(p) my_safefree((char*)p)
  625.   
  626. #define new_XPVAV() (void*)my_safemalloc(sizeof(XPVAV))
  627. #define del_XPVAV(p) my_safefree((char*)p)
  628.   
  629. #define new_XPVHV() (void*)my_safemalloc(sizeof(XPVHV))
  630. #define del_XPVHV(p) my_safefree((char*)p)
  631.   
  632. #define new_XPVCV() (void*)my_safemalloc(sizeof(XPVCV))
  633. #define del_XPVCV(p) my_safefree((char*)p)
  634.   
  635. #define new_XPVGV() (void*)my_safemalloc(sizeof(XPVGV))
  636. #define del_XPVGV(p) my_safefree((char*)p)
  637.   
  638. #define new_XPVBM() (void*)my_safemalloc(sizeof(XPVBM))
  639. #define del_XPVBM(p) my_safefree((char*)p)
  640.   
  641. #define new_XPVFM() (void*)my_safemalloc(sizeof(XPVFM))
  642. #define del_XPVFM(p) my_safefree((char*)p)
  643.   
  644. #define new_XPVIO() (void*)my_safemalloc(sizeof(XPVIO))
  645. #define del_XPVIO(p) my_safefree((char*)p)
  646.  
  647. bool
  648. sv_upgrade(register SV *sv, U32 mt)
  649. {
  650.     char*    pv;
  651.     U32        cur;
  652.     U32        len;
  653.     IV        iv;
  654.     double    nv;
  655.     MAGIC*    magic;
  656.     HV*        stash;
  657.  
  658.     if (SvTYPE(sv) == mt)
  659.     return TRUE;
  660.  
  661.     if (mt < SVt_PVIV)
  662.     (void)SvOOK_off(sv);
  663.  
  664.     switch (SvTYPE(sv)) {
  665.     case SVt_NULL:
  666.     pv    = 0;
  667.     cur    = 0;
  668.     len    = 0;
  669.     iv    = 0;
  670.     nv    = 0.0;
  671.     magic    = 0;
  672.     stash    = 0;
  673.     break;
  674.     case SVt_IV:
  675.     pv    = 0;
  676.     cur    = 0;
  677.     len    = 0;
  678.     iv    = SvIVX(sv);
  679.     nv    = (double)SvIVX(sv);
  680.     del_XIV(SvANY(sv));
  681.     magic    = 0;
  682.     stash    = 0;
  683.     if (mt == SVt_NV)
  684.         mt = SVt_PVNV;
  685.     else if (mt < SVt_PVIV)
  686.         mt = SVt_PVIV;
  687.     break;
  688.     case SVt_NV:
  689.     pv    = 0;
  690.     cur    = 0;
  691.     len    = 0;
  692.     nv    = SvNVX(sv);
  693.     iv    = I_32(nv);
  694.     magic    = 0;
  695.     stash    = 0;
  696.     del_XNV(SvANY(sv));
  697.     SvANY(sv) = 0;
  698.     if (mt < SVt_PVNV)
  699.         mt = SVt_PVNV;
  700.     break;
  701.     case SVt_RV:
  702.     pv    = (char*)SvRV(sv);
  703.     cur    = 0;
  704.     len    = 0;
  705.     iv    = (IV)pv;
  706.     nv    = (double)(unsigned long)pv;
  707.     del_XRV(SvANY(sv));
  708.     magic    = 0;
  709.     stash    = 0;
  710.     break;
  711.     case SVt_PV:
  712.     pv    = SvPVX(sv);
  713.     cur    = SvCUR(sv);
  714.     len    = SvLEN(sv);
  715.     iv    = 0;
  716.     nv    = 0.0;
  717.     magic    = 0;
  718.     stash    = 0;
  719.     del_XPV(SvANY(sv));
  720.     if (mt <= SVt_IV)
  721.         mt = SVt_PVIV;
  722.     else if (mt == SVt_NV)
  723.         mt = SVt_PVNV;
  724.     break;
  725.     case SVt_PVIV:
  726.     pv    = SvPVX(sv);
  727.     cur    = SvCUR(sv);
  728.     len    = SvLEN(sv);
  729.     iv    = SvIVX(sv);
  730.     nv    = 0.0;
  731.     magic    = 0;
  732.     stash    = 0;
  733.     del_XPVIV(SvANY(sv));
  734.     break;
  735.     case SVt_PVNV:
  736.     pv    = SvPVX(sv);
  737.     cur    = SvCUR(sv);
  738.     len    = SvLEN(sv);
  739.     iv    = SvIVX(sv);
  740.     nv    = SvNVX(sv);
  741.     magic    = 0;
  742.     stash    = 0;
  743.     del_XPVNV(SvANY(sv));
  744.     break;
  745.     case SVt_PVMG:
  746.     pv    = SvPVX(sv);
  747.     cur    = SvCUR(sv);
  748.     len    = SvLEN(sv);
  749.     iv    = SvIVX(sv);
  750.     nv    = SvNVX(sv);
  751.     magic    = SvMAGIC(sv);
  752.     stash    = SvSTASH(sv);
  753.     del_XPVMG(SvANY(sv));
  754.     break;
  755.     default:
  756.     croak("Can't upgrade that kind of scalar");
  757.     }
  758.  
  759.     switch (mt) {
  760.     case SVt_NULL:
  761.     croak("Can't upgrade to undef");
  762.     case SVt_IV:
  763.     SvANY(sv) = new_XIV();
  764.     SvIVX(sv)    = iv;
  765.     break;
  766.     case SVt_NV:
  767.     SvANY(sv) = new_XNV();
  768.     SvNVX(sv)    = nv;
  769.     break;
  770.     case SVt_RV:
  771.     SvANY(sv) = new_XRV();
  772.     SvRV(sv) = (SV*)pv;
  773.     break;
  774.     case SVt_PV:
  775.     SvANY(sv) = new_XPV();
  776.     SvPVX(sv)    = pv;
  777.     SvCUR(sv)    = cur;
  778.     SvLEN(sv)    = len;
  779.     break;
  780.     case SVt_PVIV:
  781.     SvANY(sv) = new_XPVIV();
  782.     SvPVX(sv)    = pv;
  783.     SvCUR(sv)    = cur;
  784.     SvLEN(sv)    = len;
  785.     SvIVX(sv)    = iv;
  786.     if (SvNIOK(sv))
  787.         (void)SvIOK_on(sv);
  788.     SvNOK_off(sv);
  789.     break;
  790.     case SVt_PVNV:
  791.     SvANY(sv) = new_XPVNV();
  792.     SvPVX(sv)    = pv;
  793.     SvCUR(sv)    = cur;
  794.     SvLEN(sv)    = len;
  795.     SvIVX(sv)    = iv;
  796.     SvNVX(sv)    = nv;
  797.     break;
  798.     case SVt_PVMG:
  799.     SvANY(sv) = new_XPVMG();
  800.     SvPVX(sv)    = pv;
  801.     SvCUR(sv)    = cur;
  802.     SvLEN(sv)    = len;
  803.     SvIVX(sv)    = iv;
  804.     SvNVX(sv)    = nv;
  805.     SvMAGIC(sv)    = magic;
  806.     SvSTASH(sv)    = stash;
  807.     break;
  808.     case SVt_PVLV:
  809.     SvANY(sv) = new_XPVLV();
  810.     SvPVX(sv)    = pv;
  811.     SvCUR(sv)    = cur;
  812.     SvLEN(sv)    = len;
  813.     SvIVX(sv)    = iv;
  814.     SvNVX(sv)    = nv;
  815.     SvMAGIC(sv)    = magic;
  816.     SvSTASH(sv)    = stash;
  817.     LvTARGOFF(sv)    = 0;
  818.     LvTARGLEN(sv)    = 0;
  819.     LvTARG(sv)    = 0;
  820.     LvTYPE(sv)    = 0;
  821.     break;
  822.     case SVt_PVAV:
  823.     SvANY(sv) = new_XPVAV();
  824.     if (pv)
  825.         Safefree(pv);
  826.     SvPVX(sv)    = 0;
  827.     AvMAX(sv)    = -1;
  828.     AvFILLp(sv)    = -1;
  829.     SvIVX(sv)    = 0;
  830.     SvNVX(sv)    = 0.0;
  831.     SvMAGIC(sv)    = magic;
  832.     SvSTASH(sv)    = stash;
  833.     AvALLOC(sv)    = 0;
  834.     AvARYLEN(sv)    = 0;
  835.     AvFLAGS(sv)    = 0;
  836.     break;
  837.     case SVt_PVHV:
  838.     SvANY(sv) = new_XPVHV();
  839.     if (pv)
  840.         Safefree(pv);
  841.     SvPVX(sv)    = 0;
  842.     HvFILL(sv)    = 0;
  843.     HvMAX(sv)    = 0;
  844.     HvKEYS(sv)    = 0;
  845.     SvNVX(sv)    = 0.0;
  846.     SvMAGIC(sv)    = magic;
  847.     SvSTASH(sv)    = stash;
  848.     HvRITER(sv)    = 0;
  849.     HvEITER(sv)    = 0;
  850.     HvPMROOT(sv)    = 0;
  851.     HvNAME(sv)    = 0;
  852.     break;
  853.     case SVt_PVCV:
  854.     SvANY(sv) = new_XPVCV();
  855.     Zero(SvANY(sv), 1, XPVCV);
  856.     SvPVX(sv)    = pv;
  857.     SvCUR(sv)    = cur;
  858.     SvLEN(sv)    = len;
  859.     SvIVX(sv)    = iv;
  860.     SvNVX(sv)    = nv;
  861.     SvMAGIC(sv)    = magic;
  862.     SvSTASH(sv)    = stash;
  863.     break;
  864.     case SVt_PVGV:
  865.     SvANY(sv) = new_XPVGV();
  866.     SvPVX(sv)    = pv;
  867.     SvCUR(sv)    = cur;
  868.     SvLEN(sv)    = len;
  869.     SvIVX(sv)    = iv;
  870.     SvNVX(sv)    = nv;
  871.     SvMAGIC(sv)    = magic;
  872.     SvSTASH(sv)    = stash;
  873.     GvGP(sv)    = 0;
  874.     GvNAME(sv)    = 0;
  875.     GvNAMELEN(sv)    = 0;
  876.     GvSTASH(sv)    = 0;
  877.     GvFLAGS(sv)    = 0;
  878.     break;
  879.     case SVt_PVBM:
  880.     SvANY(sv) = new_XPVBM();
  881.     SvPVX(sv)    = pv;
  882.     SvCUR(sv)    = cur;
  883.     SvLEN(sv)    = len;
  884.     SvIVX(sv)    = iv;
  885.     SvNVX(sv)    = nv;
  886.     SvMAGIC(sv)    = magic;
  887.     SvSTASH(sv)    = stash;
  888.     BmRARE(sv)    = 0;
  889.     BmUSEFUL(sv)    = 0;
  890.     BmPREVIOUS(sv)    = 0;
  891.     break;
  892.     case SVt_PVFM:
  893.     SvANY(sv) = new_XPVFM();
  894.     Zero(SvANY(sv), 1, XPVFM);
  895.     SvPVX(sv)    = pv;
  896.     SvCUR(sv)    = cur;
  897.     SvLEN(sv)    = len;
  898.     SvIVX(sv)    = iv;
  899.     SvNVX(sv)    = nv;
  900.     SvMAGIC(sv)    = magic;
  901.     SvSTASH(sv)    = stash;
  902.     break;
  903.     case SVt_PVIO:
  904.     SvANY(sv) = new_XPVIO();
  905.     Zero(SvANY(sv), 1, XPVIO);
  906.     SvPVX(sv)    = pv;
  907.     SvCUR(sv)    = cur;
  908.     SvLEN(sv)    = len;
  909.     SvIVX(sv)    = iv;
  910.     SvNVX(sv)    = nv;
  911.     SvMAGIC(sv)    = magic;
  912.     SvSTASH(sv)    = stash;
  913.     IoPAGE_LEN(sv)    = 60;
  914.     break;
  915.     }
  916.     SvFLAGS(sv) &= ~SVTYPEMASK;
  917.     SvFLAGS(sv) |= mt;
  918.     return TRUE;
  919. }
  920.  
  921. char *
  922. sv_peek(SV *sv)
  923. {
  924. #ifdef DEBUGGING
  925.     SV *t = sv_newmortal();
  926.     STRLEN prevlen;
  927.     int unref = 0;
  928.  
  929.     sv_setpvn(t, "", 0);
  930.   retry:
  931.     if (!sv) {
  932.     sv_catpv(t, "VOID");
  933.     goto finish;
  934.     }
  935.     else if (sv == (SV*)0x55555555 || SvTYPE(sv) == 'U') {
  936.     sv_catpv(t, "WILD");
  937.     goto finish;
  938.     }
  939.     else if (sv == &PL_sv_undef || sv == &PL_sv_no || sv == &PL_sv_yes) {
  940.     if (sv == &PL_sv_undef) {
  941.         sv_catpv(t, "SV_UNDEF");
  942.         if (!(SvFLAGS(sv) & (SVf_OK|SVf_OOK|SVs_OBJECT|
  943.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  944.         SvREADONLY(sv))
  945.         goto finish;
  946.     }
  947.     else if (sv == &PL_sv_no) {
  948.         sv_catpv(t, "SV_NO");
  949.         if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
  950.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  951.         !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
  952.                   SVp_POK|SVp_NOK)) &&
  953.         SvCUR(sv) == 0 &&
  954.         SvNVX(sv) == 0.0)
  955.         goto finish;
  956.     }
  957.     else {
  958.         sv_catpv(t, "SV_YES");
  959.         if (!(SvFLAGS(sv) & (SVf_ROK|SVf_OOK|SVs_OBJECT|
  960.                  SVs_GMG|SVs_SMG|SVs_RMG)) &&
  961.         !(~SvFLAGS(sv) & (SVf_POK|SVf_NOK|SVf_READONLY|
  962.                   SVp_POK|SVp_NOK)) &&
  963.         SvCUR(sv) == 1 &&
  964.         SvPVX(sv) && *SvPVX(sv) == '1' &&
  965.         SvNVX(sv) == 1.0)
  966.         goto finish;
  967.     }
  968.     sv_catpv(t, ":");
  969.     }
  970.     else if (SvREFCNT(sv) == 0) {
  971.     sv_catpv(t, "(");
  972.     unref++;
  973.     }
  974.     if (SvROK(sv)) {
  975.     sv_catpv(t, "\\");
  976.     if (SvCUR(t) + unref > 10) {
  977.         SvCUR(t) = unref + 3;
  978.         *SvEND(t) = '\0';
  979.         sv_catpv(t, "...");
  980.         goto finish;
  981.     }
  982.     sv = (SV*)SvRV(sv);
  983.     goto retry;
  984.     }
  985.     switch (SvTYPE(sv)) {
  986.     default:
  987.     sv_catpv(t, "FREED");
  988.     goto finish;
  989.  
  990.     case SVt_NULL:
  991.     sv_catpv(t, "UNDEF");
  992.     goto finish;
  993.     case SVt_IV:
  994.     sv_catpv(t, "IV");
  995.     break;
  996.     case SVt_NV:
  997.     sv_catpv(t, "NV");
  998.     break;
  999.     case SVt_RV:
  1000.     sv_catpv(t, "RV");
  1001.     break;
  1002.     case SVt_PV:
  1003.     sv_catpv(t, "PV");
  1004.     break;
  1005.     case SVt_PVIV:
  1006.     sv_catpv(t, "PVIV");
  1007.     break;
  1008.     case SVt_PVNV:
  1009.     sv_catpv(t, "PVNV");
  1010.     break;
  1011.     case SVt_PVMG:
  1012.     sv_catpv(t, "PVMG");
  1013.     break;
  1014.     case SVt_PVLV:
  1015.     sv_catpv(t, "PVLV");
  1016.     break;
  1017.     case SVt_PVAV:
  1018.     sv_catpv(t, "AV");
  1019.     break;
  1020.     case SVt_PVHV:
  1021.     sv_catpv(t, "HV");
  1022.     break;
  1023.     case SVt_PVCV:
  1024.     if (CvGV(sv))
  1025.         sv_catpvf(t, "CV(%s)", GvNAME(CvGV(sv)));
  1026.     else
  1027.         sv_catpv(t, "CV()");
  1028.     goto finish;
  1029.     case SVt_PVGV:
  1030.     sv_catpv(t, "GV");
  1031.     break;
  1032.     case SVt_PVBM:
  1033.     sv_catpv(t, "BM");
  1034.     break;
  1035.     case SVt_PVFM:
  1036.     sv_catpv(t, "FM");
  1037.     break;
  1038.     case SVt_PVIO:
  1039.     sv_catpv(t, "IO");
  1040.     break;
  1041.     }
  1042.  
  1043.     if (SvPOKp(sv)) {
  1044.     if (!SvPVX(sv))
  1045.         sv_catpv(t, "(null)");
  1046.     if (SvOOK(sv))
  1047.         sv_catpvf(t, "(%ld+\"%.127s\")",(long)SvIVX(sv),SvPVX(sv));
  1048.     else
  1049.         sv_catpvf(t, "(\"%.127s\")",SvPVX(sv));
  1050.     }
  1051.     else if (SvNOKp(sv)) {
  1052.     SET_NUMERIC_STANDARD();
  1053.     sv_catpvf(t, "(%g)",SvNVX(sv));
  1054.     }
  1055.     else if (SvIOKp(sv))
  1056.     sv_catpvf(t, "(%ld)",(long)SvIVX(sv));
  1057.     else
  1058.     sv_catpv(t, "()");
  1059.     
  1060.   finish:
  1061.     if (unref) {
  1062.     while (unref--)
  1063.         sv_catpv(t, ")");
  1064.     }
  1065.     return SvPV(t, PL_na);
  1066. #else    /* DEBUGGING */
  1067.     return "";
  1068. #endif    /* DEBUGGING */
  1069. }
  1070.  
  1071. int
  1072. sv_backoff(register SV *sv)
  1073. {
  1074.     assert(SvOOK(sv));
  1075.     if (SvIVX(sv)) {
  1076.     char *s = SvPVX(sv);
  1077.     SvLEN(sv) += SvIVX(sv);
  1078.     SvPVX(sv) -= SvIVX(sv);
  1079.     SvIV_set(sv, 0);
  1080.     Move(s, SvPVX(sv), SvCUR(sv)+1, char);
  1081.     }
  1082.     SvFLAGS(sv) &= ~SVf_OOK;
  1083.     return 0;
  1084. }
  1085.  
  1086. char *
  1087. #ifndef DOSISH
  1088. sv_grow(register SV *sv, register I32 newlen)
  1089. #else
  1090. sv_grow(SV* sv, unsigned long newlen)
  1091. #endif
  1092. {
  1093.     register char *s;
  1094.  
  1095. #ifdef HAS_64K_LIMIT
  1096.     if (newlen >= 0x10000) {
  1097.     PerlIO_printf(Perl_debug_log, "Allocation too large: %lx\n", newlen);
  1098.     my_exit(1);
  1099.     }
  1100. #endif /* HAS_64K_LIMIT */
  1101.     if (SvROK(sv))
  1102.     sv_unref(sv);
  1103.     if (SvTYPE(sv) < SVt_PV) {
  1104.     sv_upgrade(sv, SVt_PV);
  1105.     s = SvPVX(sv);
  1106.     }
  1107.     else if (SvOOK(sv)) {    /* pv is offset? */
  1108.     sv_backoff(sv);
  1109.     s = SvPVX(sv);
  1110.     if (newlen > SvLEN(sv))
  1111.         newlen += 10 * (newlen - SvCUR(sv)); /* avoid copy each time */
  1112. #ifdef HAS_64K_LIMIT
  1113.     if (newlen >= 0x10000)
  1114.         newlen = 0xFFFF;
  1115. #endif
  1116.     }
  1117.     else
  1118.     s = SvPVX(sv);
  1119.     if (newlen > SvLEN(sv)) {        /* need more room? */
  1120.     if (SvLEN(sv) && s) {
  1121. #if defined(MYMALLOC) && !defined(PURIFY) && !defined(LEAKTEST)
  1122.         STRLEN l = malloced_size((void*)SvPVX(sv));
  1123.         if (newlen <= l) {
  1124.         SvLEN_set(sv, l);
  1125.         return s;
  1126.         } else
  1127. #endif
  1128.         Renew(s,newlen,char);
  1129.     }
  1130.         else
  1131.         New(703,s,newlen,char);
  1132.     SvPV_set(sv, s);
  1133.         SvLEN_set(sv, newlen);
  1134.     }
  1135.     return s;
  1136. }
  1137.  
  1138. void
  1139. sv_setiv(register SV *sv, IV i)
  1140. {
  1141.     SV_CHECK_THINKFIRST(sv);
  1142.     switch (SvTYPE(sv)) {
  1143.     case SVt_NULL:
  1144.     sv_upgrade(sv, SVt_IV);
  1145.     break;
  1146.     case SVt_NV:
  1147.     sv_upgrade(sv, SVt_PVNV);
  1148.     break;
  1149.     case SVt_RV:
  1150.     case SVt_PV:
  1151.     sv_upgrade(sv, SVt_PVIV);
  1152.     break;
  1153.  
  1154.     case SVt_PVGV:
  1155.     if (SvFAKE(sv)) {
  1156.         sv_unglob(sv);
  1157.         break;
  1158.     }
  1159.     /* FALL THROUGH */
  1160.     case SVt_PVAV:
  1161.     case SVt_PVHV:
  1162.     case SVt_PVCV:
  1163.     case SVt_PVFM:
  1164.     case SVt_PVIO:
  1165.     {
  1166.         dTHR;
  1167.         croak("Can't coerce %s to integer in %s", sv_reftype(sv,0),
  1168.           op_desc[PL_op->op_type]);
  1169.     }
  1170.     }
  1171.     (void)SvIOK_only(sv);            /* validate number */
  1172.     SvIVX(sv) = i;
  1173.     SvTAINT(sv);
  1174. }
  1175.  
  1176. void
  1177. sv_setiv_mg(register SV *sv, IV i)
  1178. {
  1179.     sv_setiv(sv,i);
  1180.     SvSETMAGIC(sv);
  1181. }
  1182.  
  1183. void
  1184. sv_setuv(register SV *sv, UV u)
  1185. {
  1186.     if (u <= IV_MAX)
  1187.     sv_setiv(sv, u);
  1188.     else
  1189.     sv_setnv(sv, (double)u);
  1190. }
  1191.  
  1192. void
  1193. sv_setuv_mg(register SV *sv, UV u)
  1194. {
  1195.     sv_setuv(sv,u);
  1196.     SvSETMAGIC(sv);
  1197. }
  1198.  
  1199. void
  1200. sv_setnv(register SV *sv, double num)
  1201. {
  1202.     SV_CHECK_THINKFIRST(sv);
  1203.     switch (SvTYPE(sv)) {
  1204.     case SVt_NULL:
  1205.     case SVt_IV:
  1206.     sv_upgrade(sv, SVt_NV);
  1207.     break;
  1208.     case SVt_RV:
  1209.     case SVt_PV:
  1210.     case SVt_PVIV:
  1211.     sv_upgrade(sv, SVt_PVNV);
  1212.     break;
  1213.  
  1214.     case SVt_PVGV:
  1215.     if (SvFAKE(sv)) {
  1216.         sv_unglob(sv);
  1217.         break;
  1218.     }
  1219.     /* FALL THROUGH */
  1220.     case SVt_PVAV:
  1221.     case SVt_PVHV:
  1222.     case SVt_PVCV:
  1223.     case SVt_PVFM:
  1224.     case SVt_PVIO:
  1225.     {
  1226.         dTHR;
  1227.         croak("Can't coerce %s to number in %s", sv_reftype(sv,0),
  1228.           op_name[PL_op->op_type]);
  1229.     }
  1230.     }
  1231.     SvNVX(sv) = num;
  1232.     (void)SvNOK_only(sv);            /* validate number */
  1233.     SvTAINT(sv);
  1234. }
  1235.  
  1236. void
  1237. sv_setnv_mg(register SV *sv, double num)
  1238. {
  1239.     sv_setnv(sv,num);
  1240.     SvSETMAGIC(sv);
  1241. }
  1242.  
  1243. STATIC void
  1244. not_a_number(SV *sv)
  1245. {
  1246.     dTHR;
  1247.     char tmpbuf[64];
  1248.     char *d = tmpbuf;
  1249.     char *s;
  1250.     char *limit = tmpbuf + sizeof(tmpbuf) - 8;
  1251.                   /* each *s can expand to 4 chars + "...\0",
  1252.                      i.e. need room for 8 chars */
  1253.  
  1254.     for (s = SvPVX(sv); *s && d < limit; s++) {
  1255.     int ch = *s & 0xFF;
  1256.     if (ch & 128 && !isPRINT_LC(ch)) {
  1257.         *d++ = 'M';
  1258.         *d++ = '-';
  1259.         ch &= 127;
  1260.     }
  1261.     if (ch == '\n') {
  1262.         *d++ = '\\';
  1263.         *d++ = 'n';
  1264.     }
  1265.     else if (ch == '\r') {
  1266.         *d++ = '\\';
  1267.         *d++ = 'r';
  1268.     }
  1269.     else if (ch == '\f') {
  1270.         *d++ = '\\';
  1271.         *d++ = 'f';
  1272.     }
  1273.     else if (ch == '\\') {
  1274.         *d++ = '\\';
  1275.         *d++ = '\\';
  1276.     }
  1277.     else if (isPRINT_LC(ch))
  1278.         *d++ = ch;
  1279.     else {
  1280.         *d++ = '^';
  1281.         *d++ = toCTRL(ch);
  1282.     }
  1283.     }
  1284.     if (*s) {
  1285.     *d++ = '.';
  1286.     *d++ = '.';
  1287.     *d++ = '.';
  1288.     }
  1289.     *d = '\0';
  1290.  
  1291.     if (PL_op)
  1292.     warn("Argument \"%s\" isn't numeric in %s", tmpbuf,
  1293.         op_name[PL_op->op_type]);
  1294.     else
  1295.     warn("Argument \"%s\" isn't numeric", tmpbuf);
  1296. }
  1297.  
  1298. IV
  1299. sv_2iv(register SV *sv)
  1300. {
  1301.     if (!sv)
  1302.     return 0;
  1303.     if (SvGMAGICAL(sv)) {
  1304.     mg_get(sv);
  1305.     if (SvIOKp(sv))
  1306.         return SvIVX(sv);
  1307.     if (SvNOKp(sv)) {
  1308.         if (SvNVX(sv) < 0.0)
  1309.         return I_V(SvNVX(sv));
  1310.         else
  1311.         return (IV) U_V(SvNVX(sv));
  1312.     }
  1313.     if (SvPOKp(sv) && SvLEN(sv))
  1314.         return asIV(sv);
  1315.     if (!SvROK(sv)) {
  1316.         if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
  1317.         dTHR;
  1318.         if (!PL_localizing)
  1319.             warn(warn_uninit);
  1320.         }
  1321.         return 0;
  1322.     }
  1323.     }
  1324.     if (SvTHINKFIRST(sv)) {
  1325.     if (SvROK(sv)) {
  1326. #ifdef OVERLOAD
  1327.       SV* tmpstr;
  1328.       if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
  1329.         return SvIV(tmpstr);
  1330. #endif /* OVERLOAD */
  1331.       return (IV)SvRV(sv);
  1332.     }
  1333.     if (SvREADONLY(sv)) {
  1334.         if (SvNOKp(sv)) {
  1335.         if (SvNVX(sv) < 0.0)
  1336.             return I_V(SvNVX(sv));
  1337.         else
  1338.             return (IV) U_V(SvNVX(sv));
  1339.         }
  1340.         if (SvPOKp(sv) && SvLEN(sv))
  1341.         return asIV(sv);
  1342.         if (PL_dowarn)
  1343.         warn(warn_uninit);
  1344.         return 0;
  1345.     }
  1346.     }
  1347.     switch (SvTYPE(sv)) {
  1348.     case SVt_NULL:
  1349.     sv_upgrade(sv, SVt_IV);
  1350.     break;
  1351.     case SVt_PV:
  1352.     sv_upgrade(sv, SVt_PVIV);
  1353.     break;
  1354.     case SVt_NV:
  1355.     sv_upgrade(sv, SVt_PVNV);
  1356.     break;
  1357.     }
  1358.     if (SvNOKp(sv)) {
  1359.     (void)SvIOK_on(sv);
  1360.     if (SvNVX(sv) < 0.0)
  1361.         SvIVX(sv) = I_V(SvNVX(sv));
  1362.     else
  1363.         SvUVX(sv) = U_V(SvNVX(sv));
  1364.     }
  1365.     else if (SvPOKp(sv) && SvLEN(sv)) {
  1366.     (void)SvIOK_on(sv);
  1367.     SvIVX(sv) = asIV(sv);
  1368.     }
  1369.     else  {
  1370.     dTHR;
  1371.     if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
  1372.         warn(warn_uninit);
  1373.     return 0;
  1374.     }
  1375.     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2iv(%ld)\n",
  1376.     (unsigned long)sv,(long)SvIVX(sv)));
  1377.     return SvIVX(sv);
  1378. }
  1379.  
  1380. UV
  1381. sv_2uv(register SV *sv)
  1382. {
  1383.     if (!sv)
  1384.     return 0;
  1385.     if (SvGMAGICAL(sv)) {
  1386.     mg_get(sv);
  1387.     if (SvIOKp(sv))
  1388.         return SvUVX(sv);
  1389.     if (SvNOKp(sv))
  1390.         return U_V(SvNVX(sv));
  1391.     if (SvPOKp(sv) && SvLEN(sv))
  1392.         return asUV(sv);
  1393.     if (!SvROK(sv)) {
  1394.         if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
  1395.         dTHR;
  1396.         if (!PL_localizing)
  1397.             warn(warn_uninit);
  1398.         }
  1399.         return 0;
  1400.     }
  1401.     }
  1402.     if (SvTHINKFIRST(sv)) {
  1403.     if (SvROK(sv)) {
  1404. #ifdef OVERLOAD
  1405.       SV* tmpstr;
  1406.       if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv, numer)))
  1407.         return SvUV(tmpstr);
  1408. #endif /* OVERLOAD */
  1409.       return (UV)SvRV(sv);
  1410.     }
  1411.     if (SvREADONLY(sv)) {
  1412.         if (SvNOKp(sv)) {
  1413.         return U_V(SvNVX(sv));
  1414.         }
  1415.         if (SvPOKp(sv) && SvLEN(sv))
  1416.         return asUV(sv);
  1417.         if (PL_dowarn)
  1418.         warn(warn_uninit);
  1419.         return 0;
  1420.     }
  1421.     }
  1422.     switch (SvTYPE(sv)) {
  1423.     case SVt_NULL:
  1424.     sv_upgrade(sv, SVt_IV);
  1425.     break;
  1426.     case SVt_PV:
  1427.     sv_upgrade(sv, SVt_PVIV);
  1428.     break;
  1429.     case SVt_NV:
  1430.     sv_upgrade(sv, SVt_PVNV);
  1431.     break;
  1432.     }
  1433.     if (SvNOKp(sv)) {
  1434.     (void)SvIOK_on(sv);
  1435.     SvUVX(sv) = U_V(SvNVX(sv));
  1436.     }
  1437.     else if (SvPOKp(sv) && SvLEN(sv)) {
  1438.     (void)SvIOK_on(sv);
  1439.     SvUVX(sv) = asUV(sv);
  1440.     }
  1441.     else  {
  1442.     if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
  1443.         dTHR;
  1444.         if (!PL_localizing)
  1445.         warn(warn_uninit);
  1446.     }
  1447.     return 0;
  1448.     }
  1449.     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2uv(%lu)\n",
  1450.     (unsigned long)sv,SvUVX(sv)));
  1451.     return SvUVX(sv);
  1452. }
  1453.  
  1454. double
  1455. sv_2nv(register SV *sv)
  1456. {
  1457.     if (!sv)
  1458.     return 0.0;
  1459.     if (SvGMAGICAL(sv)) {
  1460.     mg_get(sv);
  1461.     if (SvNOKp(sv))
  1462.         return SvNVX(sv);
  1463.     if (SvPOKp(sv) && SvLEN(sv)) {
  1464.         if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1465.         not_a_number(sv);
  1466.         SET_NUMERIC_STANDARD();
  1467.         return atof(SvPVX(sv));
  1468.     }
  1469.     if (SvIOKp(sv))
  1470.         return (double)SvIVX(sv);
  1471.         if (!SvROK(sv)) {
  1472.         if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
  1473.         dTHR;
  1474.         if (!PL_localizing)
  1475.             warn(warn_uninit);
  1476.         }
  1477.             return 0;
  1478.         }
  1479.     }
  1480.     if (SvTHINKFIRST(sv)) {
  1481.     if (SvROK(sv)) {
  1482. #ifdef OVERLOAD
  1483.       SV* tmpstr;
  1484.       if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,numer)))
  1485.         return SvNV(tmpstr);
  1486. #endif /* OVERLOAD */
  1487.       return (double)(unsigned long)SvRV(sv);
  1488.     }
  1489.     if (SvREADONLY(sv)) {
  1490.         if (SvPOKp(sv) && SvLEN(sv)) {
  1491.         if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1492.             not_a_number(sv);
  1493.         SET_NUMERIC_STANDARD();
  1494.         return atof(SvPVX(sv));
  1495.         }
  1496.         if (SvIOKp(sv))
  1497.         return (double)SvIVX(sv);
  1498.         if (PL_dowarn)
  1499.         warn(warn_uninit);
  1500.         return 0.0;
  1501.     }
  1502.     }
  1503.     if (SvTYPE(sv) < SVt_NV) {
  1504.     if (SvTYPE(sv) == SVt_IV)
  1505.         sv_upgrade(sv, SVt_PVNV);
  1506.     else
  1507.         sv_upgrade(sv, SVt_NV);
  1508.     DEBUG_c(SET_NUMERIC_STANDARD());
  1509.     DEBUG_c(PerlIO_printf(Perl_debug_log,
  1510.                   "0x%lx num(%g)\n",(unsigned long)sv,SvNVX(sv)));
  1511.     }
  1512.     else if (SvTYPE(sv) < SVt_PVNV)
  1513.     sv_upgrade(sv, SVt_PVNV);
  1514.     if (SvIOKp(sv) &&
  1515.         (!SvPOKp(sv) || !strchr(SvPVX(sv),'.') || !looks_like_number(sv)))
  1516.     {
  1517.     SvNVX(sv) = (double)SvIVX(sv);
  1518.     }
  1519.     else if (SvPOKp(sv) && SvLEN(sv)) {
  1520.     if (PL_dowarn && !SvIOKp(sv) && !looks_like_number(sv))
  1521.         not_a_number(sv);
  1522.     SET_NUMERIC_STANDARD();
  1523.     SvNVX(sv) = atof(SvPVX(sv));
  1524.     }
  1525.     else  {
  1526.     dTHR;
  1527.     if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
  1528.         warn(warn_uninit);
  1529.     return 0.0;
  1530.     }
  1531.     SvNOK_on(sv);
  1532.     DEBUG_c(SET_NUMERIC_STANDARD());
  1533.     DEBUG_c(PerlIO_printf(Perl_debug_log,
  1534.               "0x%lx 2nv(%g)\n",(unsigned long)sv,SvNVX(sv)));
  1535.     return SvNVX(sv);
  1536. }
  1537.  
  1538. STATIC IV
  1539. asIV(SV *sv)
  1540. {
  1541.     I32 numtype = looks_like_number(sv);
  1542.     double d;
  1543.  
  1544.     if (numtype == 1)
  1545.     return atol(SvPVX(sv));
  1546.     if (!numtype && PL_dowarn)
  1547.     not_a_number(sv);
  1548.     SET_NUMERIC_STANDARD();
  1549.     d = atof(SvPVX(sv));
  1550.     if (d < 0.0)
  1551.     return I_V(d);
  1552.     else
  1553.     return (IV) U_V(d);
  1554. }
  1555.  
  1556. STATIC UV
  1557. asUV(SV *sv)
  1558. {
  1559.     I32 numtype = looks_like_number(sv);
  1560.  
  1561. #ifdef HAS_STRTOUL
  1562.     if (numtype == 1)
  1563.     return strtoul(SvPVX(sv), Null(char**), 10);
  1564. #endif
  1565.     if (!numtype && PL_dowarn)
  1566.     not_a_number(sv);
  1567.     SET_NUMERIC_STANDARD();
  1568.     return U_V(atof(SvPVX(sv)));
  1569. }
  1570.  
  1571. I32
  1572. looks_like_number(SV *sv)
  1573. {
  1574.     register char *s;
  1575.     register char *send;
  1576.     register char *sbegin;
  1577.     I32 numtype;
  1578.     STRLEN len;
  1579.  
  1580.     if (SvPOK(sv)) {
  1581.     sbegin = SvPVX(sv); 
  1582.     len = SvCUR(sv);
  1583.     }
  1584.     else if (SvPOKp(sv))
  1585.     sbegin = SvPV(sv, len);
  1586.     else
  1587.     return 1;
  1588.     send = sbegin + len;
  1589.  
  1590.     s = sbegin;
  1591.     while (isSPACE(*s))
  1592.     s++;
  1593.     if (*s == '+' || *s == '-')
  1594.     s++;
  1595.  
  1596.     /* next must be digit or '.' */
  1597.     if (isDIGIT(*s)) {
  1598.         do {
  1599.         s++;
  1600.         } while (isDIGIT(*s));
  1601.         if (*s == '.') {
  1602.         s++;
  1603.             while (isDIGIT(*s))  /* optional digits after "." */
  1604.                 s++;
  1605.         }
  1606.     }
  1607.     else if (*s == '.') {
  1608.         s++;
  1609.         /* no digits before '.' means we need digits after it */
  1610.         if (isDIGIT(*s)) {
  1611.         do {
  1612.             s++;
  1613.             } while (isDIGIT(*s));
  1614.         }
  1615.         else
  1616.         return 0;
  1617.     }
  1618.     else
  1619.         return 0;
  1620.  
  1621.     /*
  1622.      * we return 1 if the number can be converted to _integer_ with atol()
  1623.      * and 2 if you need (int)atof().
  1624.      */
  1625.     numtype = 1;
  1626.  
  1627.     /* we can have an optional exponent part */
  1628.     if (*s == 'e' || *s == 'E') {
  1629.     numtype = 2;
  1630.     s++;
  1631.     if (*s == '+' || *s == '-')
  1632.         s++;
  1633.         if (isDIGIT(*s)) {
  1634.             do {
  1635.                 s++;
  1636.             } while (isDIGIT(*s));
  1637.         }
  1638.         else
  1639.             return 0;
  1640.     }
  1641.     while (isSPACE(*s))
  1642.     s++;
  1643.     if (s >= send)
  1644.     return numtype;
  1645.     if (len == 10 && memEQ(sbegin, "0 but true", 10))
  1646.     return 1;
  1647.     return 0;
  1648. }
  1649.  
  1650. char *
  1651. sv_2pv(register SV *sv, STRLEN *lp)
  1652. {
  1653.     register char *s;
  1654.     int olderrno;
  1655.     SV *tsv;
  1656.     char tmpbuf[64];    /* Must fit sprintf/Gconvert of longest IV/NV */
  1657.  
  1658.     if (!sv) {
  1659.     *lp = 0;
  1660.     return "";
  1661.     }
  1662.     if (SvGMAGICAL(sv)) {
  1663.     mg_get(sv);
  1664.     if (SvPOKp(sv)) {
  1665.         *lp = SvCUR(sv);
  1666.         return SvPVX(sv);
  1667.     }
  1668.     if (SvIOKp(sv)) {
  1669.         (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
  1670.         tsv = Nullsv;
  1671.         goto tokensave;
  1672.     }
  1673.     if (SvNOKp(sv)) {
  1674.         SET_NUMERIC_STANDARD();
  1675.         Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
  1676.         tsv = Nullsv;
  1677.         goto tokensave;
  1678.     }
  1679.         if (!SvROK(sv)) {
  1680.         if (PL_dowarn && !(SvFLAGS(sv) & SVs_PADTMP)) {
  1681.         dTHR;
  1682.         if (!PL_localizing)
  1683.             warn(warn_uninit);
  1684.         }
  1685.             *lp = 0;
  1686.             return "";
  1687.         }
  1688.     }
  1689.     if (SvTHINKFIRST(sv)) {
  1690.     if (SvROK(sv)) {
  1691. #ifdef OVERLOAD
  1692.         SV* tmpstr;
  1693.         if (SvAMAGIC(sv) && (tmpstr=AMG_CALLun(sv,string)))
  1694.           return SvPV(tmpstr,*lp);
  1695. #endif /* OVERLOAD */
  1696.         sv = (SV*)SvRV(sv);
  1697.         if (!sv)
  1698.         s = "NULLREF";
  1699.         else {
  1700.         MAGIC *mg;
  1701.         
  1702.         switch (SvTYPE(sv)) {
  1703.         case SVt_PVMG:
  1704.             if ( ((SvFLAGS(sv) &
  1705.                (SVs_OBJECT|SVf_OK|SVs_GMG|SVs_SMG|SVs_RMG)) 
  1706.               == (SVs_OBJECT|SVs_RMG))
  1707.              && strEQ(s=HvNAME(SvSTASH(sv)), "Regexp")
  1708.              && (mg = mg_find(sv, 'r'))) {
  1709.             dTHR;
  1710.             regexp *re = (regexp *)mg->mg_obj;
  1711.  
  1712.             if (!mg->mg_ptr) {
  1713.                 char *fptr = "msix";
  1714.                 char reflags[6];
  1715.                 char ch;
  1716.                 int left = 0;
  1717.                 int right = 4;
  1718.                  U16 reganch = (re->reganch & PMf_COMPILETIME) >> 12;
  1719.  
  1720.                  while(ch = *fptr++) {
  1721.                  if(reganch & 1) {
  1722.                      reflags[left++] = ch;
  1723.                  }
  1724.                  else {
  1725.                      reflags[right--] = ch;
  1726.                  }
  1727.                  reganch >>= 1;
  1728.                  }
  1729.                  if(left != 4) {
  1730.                  reflags[left] = '-';
  1731.                  left = 5;
  1732.                  }
  1733.  
  1734.                 mg->mg_len = re->prelen + 4 + left;
  1735.                 New(616, mg->mg_ptr, mg->mg_len + 1 + left, char);
  1736.                 Copy("(?", mg->mg_ptr, 2, char);
  1737.                 Copy(reflags, mg->mg_ptr+2, left, char);
  1738.                 Copy(":", mg->mg_ptr+left+2, 1, char);
  1739.                 Copy(re->precomp, mg->mg_ptr+3+left, re->prelen, char);
  1740.                 mg->mg_ptr[mg->mg_len - 1] = ')';
  1741.                 mg->mg_ptr[mg->mg_len] = 0;
  1742.             }
  1743.             PL_reginterp_cnt += re->program[0].next_off;
  1744.             *lp = mg->mg_len;
  1745.             return mg->mg_ptr;
  1746.             }
  1747.                     /* Fall through */
  1748.         case SVt_NULL:
  1749.         case SVt_IV:
  1750.         case SVt_NV:
  1751.         case SVt_RV:
  1752.         case SVt_PV:
  1753.         case SVt_PVIV:
  1754.         case SVt_PVNV:
  1755.         case SVt_PVBM:    s = "SCALAR";            break;
  1756.         case SVt_PVLV:    s = "LVALUE";            break;
  1757.         case SVt_PVAV:    s = "ARRAY";            break;
  1758.         case SVt_PVHV:    s = "HASH";            break;
  1759.         case SVt_PVCV:    s = "CODE";            break;
  1760.         case SVt_PVGV:    s = "GLOB";            break;
  1761.         case SVt_PVFM:    s = "FORMAT";            break;
  1762.         case SVt_PVIO:    s = "IO";            break;
  1763.         default:    s = "UNKNOWN";            break;
  1764.         }
  1765.         tsv = NEWSV(0,0);
  1766.         if (SvOBJECT(sv))
  1767.             sv_setpvf(tsv, "%s=%s", HvNAME(SvSTASH(sv)), s);
  1768.         else
  1769.             sv_setpv(tsv, s);
  1770.         sv_catpvf(tsv, "(0x%lx)", (unsigned long)sv);
  1771.         goto tokensaveref;
  1772.         }
  1773.         *lp = strlen(s);
  1774.         return s;
  1775.     }
  1776.     if (SvREADONLY(sv)) {
  1777.         if (SvNOKp(sv)) {
  1778.         SET_NUMERIC_STANDARD();
  1779.         Gconvert(SvNVX(sv), DBL_DIG, 0, tmpbuf);
  1780.         tsv = Nullsv;
  1781.         goto tokensave;
  1782.         }
  1783.         if (SvIOKp(sv)) {
  1784.         (void)sprintf(tmpbuf,"%ld",(long)SvIVX(sv));
  1785.         tsv = Nullsv;
  1786.         goto tokensave;
  1787.         }
  1788.         if (PL_dowarn)
  1789.         warn(warn_uninit);
  1790.         *lp = 0;
  1791.         return "";
  1792.     }
  1793.     }
  1794.     (void)SvUPGRADE(sv, SVt_PV);
  1795.     if (SvNOKp(sv)) {
  1796.     if (SvTYPE(sv) < SVt_PVNV)
  1797.         sv_upgrade(sv, SVt_PVNV);
  1798.     SvGROW(sv, 28);
  1799.     s = SvPVX(sv);
  1800.     olderrno = errno;    /* some Xenix systems wipe out errno here */
  1801. #ifdef apollo
  1802.     if (SvNVX(sv) == 0.0)
  1803.         (void)strcpy(s,"0");
  1804.     else
  1805. #endif /*apollo*/
  1806.     {
  1807.         SET_NUMERIC_STANDARD();
  1808.         Gconvert(SvNVX(sv), DBL_DIG, 0, s);
  1809.     }
  1810.     errno = olderrno;
  1811. #ifdef FIXNEGATIVEZERO
  1812.         if (*s == '-' && s[1] == '0' && !s[2])
  1813.         strcpy(s,"0");
  1814. #endif
  1815.     while (*s) s++;
  1816. #ifdef hcx
  1817.     if (s[-1] == '.')
  1818.         *--s = '\0';
  1819. #endif
  1820.     }
  1821.     else if (SvIOKp(sv)) {
  1822.     U32 oldIOK = SvIOK(sv);
  1823.     if (SvTYPE(sv) < SVt_PVIV)
  1824.         sv_upgrade(sv, SVt_PVIV);
  1825.     olderrno = errno;    /* some Xenix systems wipe out errno here */
  1826.     sv_setpviv(sv, SvIVX(sv));
  1827.     errno = olderrno;
  1828.     s = SvEND(sv);
  1829.     if (oldIOK)
  1830.         SvIOK_on(sv);
  1831.     else
  1832.         SvIOKp_on(sv);
  1833.     }
  1834.     else {
  1835.     dTHR;
  1836.     if (PL_dowarn && !PL_localizing && !(SvFLAGS(sv) & SVs_PADTMP))
  1837.         warn(warn_uninit);
  1838.     *lp = 0;
  1839.     return "";
  1840.     }
  1841.     *lp = s - SvPVX(sv);
  1842.     SvCUR_set(sv, *lp);
  1843.     SvPOK_on(sv);
  1844.     DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",(unsigned long)sv,SvPVX(sv)));
  1845.     return SvPVX(sv);
  1846.  
  1847.   tokensave:
  1848.     if (SvROK(sv)) {    /* XXX Skip this when sv_pvn_force calls */
  1849.     /* Sneaky stuff here */
  1850.  
  1851.       tokensaveref:
  1852.     if (!tsv)
  1853.         tsv = newSVpv(tmpbuf, 0);
  1854.     sv_2mortal(tsv);
  1855.     *lp = SvCUR(tsv);
  1856.     return SvPVX(tsv);
  1857.     }
  1858.     else {
  1859.     STRLEN len;
  1860.     char *t;
  1861.  
  1862.     if (tsv) {
  1863.         sv_2mortal(tsv);
  1864.         t = SvPVX(tsv);
  1865.         len = SvCUR(tsv);
  1866.     }
  1867.     else {
  1868.         t = tmpbuf;
  1869.         len = strlen(tmpbuf);
  1870.     }
  1871. #ifdef FIXNEGATIVEZERO
  1872.     if (len == 2 && t[0] == '-' && t[1] == '0') {
  1873.         t = "0";
  1874.         len = 1;
  1875.     }
  1876. #endif
  1877.     (void)SvUPGRADE(sv, SVt_PV);
  1878.     *lp = len;
  1879.     s = SvGROW(sv, len + 1);
  1880.     SvCUR_set(sv, len);
  1881.     (void)strcpy(s, t);
  1882.     SvPOKp_on(sv);
  1883.     return s;
  1884.     }
  1885. }
  1886.  
  1887. /* This function is only called on magical items */
  1888. bool
  1889. sv_2bool(register SV *sv)
  1890. {
  1891.     if (SvGMAGICAL(sv))
  1892.     mg_get(sv);
  1893.  
  1894.     if (!SvOK(sv))
  1895.     return 0;
  1896.     if (SvROK(sv)) {
  1897. #ifdef OVERLOAD
  1898.       {
  1899.     dTHR;
  1900.     SV* tmpsv;
  1901.     if (SvAMAGIC(sv) && (tmpsv = AMG_CALLun(sv,bool_)))
  1902.       return SvTRUE(tmpsv);
  1903.       }
  1904. #endif /* OVERLOAD */
  1905.       return SvRV(sv) != 0;
  1906.     }
  1907.     if (SvPOKp(sv)) {
  1908.     register XPV* Xpvtmp;
  1909.     if ((Xpvtmp = (XPV*)SvANY(sv)) &&
  1910.         (*Xpvtmp->xpv_pv > '0' ||
  1911.         Xpvtmp->xpv_cur > 1 ||
  1912.         (Xpvtmp->xpv_cur && *Xpvtmp->xpv_pv != '0')))
  1913.         return 1;
  1914.     else
  1915.         return 0;
  1916.     }
  1917.     else {
  1918.     if (SvIOKp(sv))
  1919.         return SvIVX(sv) != 0;
  1920.     else {
  1921.         if (SvNOKp(sv))
  1922.         return SvNVX(sv) != 0.0;
  1923.         else
  1924.         return FALSE;
  1925.     }
  1926.     }
  1927. }
  1928.  
  1929. /* Note: sv_setsv() should not be called with a source string that needs
  1930.  * to be reused, since it may destroy the source string if it is marked
  1931.  * as temporary.
  1932.  */
  1933.  
  1934. void
  1935. sv_setsv(SV *dstr, register SV *sstr)
  1936. {
  1937.     dTHR;
  1938.     register U32 sflags;
  1939.     register int dtype;
  1940.     register int stype;
  1941.  
  1942.     if (sstr == dstr)
  1943.     return;
  1944.     SV_CHECK_THINKFIRST(dstr);
  1945.     if (!sstr)
  1946.     sstr = &PL_sv_undef;
  1947.     stype = SvTYPE(sstr);
  1948.     dtype = SvTYPE(dstr);
  1949.  
  1950.     if (dtype == SVt_PVGV && (SvFLAGS(dstr) & SVf_FAKE)) {
  1951.         sv_unglob(dstr);     /* so fake GLOB won't perpetuate */
  1952.     sv_setpvn(dstr, "", 0);
  1953.         (void)SvPOK_only(dstr);
  1954.         dtype = SvTYPE(dstr);
  1955.     }
  1956.  
  1957. #ifdef OVERLOAD
  1958.     SvAMAGIC_off(dstr);
  1959. #endif /* OVERLOAD */
  1960.     /* There's a lot of redundancy below but we're going for speed here */
  1961.  
  1962.     switch (stype) {
  1963.     case SVt_NULL:
  1964.       undef_sstr:
  1965.     if (dtype != SVt_PVGV) {
  1966.         (void)SvOK_off(dstr);
  1967.         return;
  1968.     }
  1969.     break;
  1970.     case SVt_IV:
  1971.     if (SvIOK(sstr)) {
  1972.         switch (dtype) {
  1973.         case SVt_NULL:
  1974.         sv_upgrade(dstr, SVt_IV);
  1975.         break;
  1976.         case SVt_NV:
  1977.         sv_upgrade(dstr, SVt_PVNV);
  1978.         break;
  1979.         case SVt_RV:
  1980.         case SVt_PV:
  1981.         sv_upgrade(dstr, SVt_PVIV);
  1982.         break;
  1983.         }
  1984.         (void)SvIOK_only(dstr);
  1985.         SvIVX(dstr) = SvIVX(sstr);
  1986.         SvTAINT(dstr);
  1987.         return;
  1988.     }
  1989.     goto undef_sstr;
  1990.  
  1991.     case SVt_NV:
  1992.     if (SvNOK(sstr)) {
  1993.         switch (dtype) {
  1994.         case SVt_NULL:
  1995.         case SVt_IV:
  1996.         sv_upgrade(dstr, SVt_NV);
  1997.         break;
  1998.         case SVt_RV:
  1999.         case SVt_PV:
  2000.         case SVt_PVIV:
  2001.         sv_upgrade(dstr, SVt_PVNV);
  2002.         break;
  2003.         }
  2004.         SvNVX(dstr) = SvNVX(sstr);
  2005.         (void)SvNOK_only(dstr);
  2006.         SvTAINT(dstr);
  2007.         return;
  2008.     }
  2009.     goto undef_sstr;
  2010.  
  2011.     case SVt_RV:
  2012.     if (dtype < SVt_RV)
  2013.         sv_upgrade(dstr, SVt_RV);
  2014.     else if (dtype == SVt_PVGV &&
  2015.          SvTYPE(SvRV(sstr)) == SVt_PVGV) {
  2016.         sstr = SvRV(sstr);
  2017.         if (sstr == dstr) {
  2018.         if (PL_curcop->cop_stash != GvSTASH(dstr))
  2019.             GvIMPORTED_on(dstr);
  2020.         GvMULTI_on(dstr);
  2021.         return;
  2022.         }
  2023.         goto glob_assign;
  2024.     }
  2025.     break;
  2026.     case SVt_PV:
  2027.     case SVt_PVFM:
  2028.     if (dtype < SVt_PV)
  2029.         sv_upgrade(dstr, SVt_PV);
  2030.     break;
  2031.     case SVt_PVIV:
  2032.     if (dtype < SVt_PVIV)
  2033.         sv_upgrade(dstr, SVt_PVIV);
  2034.     break;
  2035.     case SVt_PVNV:
  2036.     if (dtype < SVt_PVNV)
  2037.         sv_upgrade(dstr, SVt_PVNV);
  2038.     break;
  2039.     case SVt_PVAV:
  2040.     case SVt_PVHV:
  2041.     case SVt_PVCV:
  2042.     case SVt_PVIO:
  2043.     if (PL_op)
  2044.         croak("Bizarre copy of %s in %s", sv_reftype(sstr, 0),
  2045.         op_name[PL_op->op_type]);
  2046.     else
  2047.         croak("Bizarre copy of %s", sv_reftype(sstr, 0));
  2048.     break;
  2049.  
  2050.     case SVt_PVGV:
  2051.     if (dtype <= SVt_PVGV) {
  2052.   glob_assign:
  2053.         if (dtype != SVt_PVGV) {
  2054.         char *name = GvNAME(sstr);
  2055.         STRLEN len = GvNAMELEN(sstr);
  2056.         sv_upgrade(dstr, SVt_PVGV);
  2057.         sv_magic(dstr, dstr, '*', name, len);
  2058.         GvSTASH(dstr) = (HV*)SvREFCNT_inc(GvSTASH(sstr));
  2059.         GvNAME(dstr) = savepvn(name, len);
  2060.         GvNAMELEN(dstr) = len;
  2061.         SvFAKE_on(dstr);    /* can coerce to non-glob */
  2062.         }
  2063.         /* ahem, death to those who redefine active sort subs */
  2064.         else if (PL_curstackinfo->si_type == PERLSI_SORT
  2065.              && GvCV(dstr) && PL_sortcop == CvSTART(GvCV(dstr)))
  2066.         croak("Can't redefine active sort subroutine %s",
  2067.               GvNAME(dstr));
  2068.         (void)SvOK_off(dstr);
  2069.         GvINTRO_off(dstr);        /* one-shot flag */
  2070.         gp_free((GV*)dstr);
  2071.         GvGP(dstr) = gp_ref(GvGP(sstr));
  2072.         SvTAINT(dstr);
  2073.         if (PL_curcop->cop_stash != GvSTASH(dstr))
  2074.         GvIMPORTED_on(dstr);
  2075.         GvMULTI_on(dstr);
  2076.         return;
  2077.     }
  2078.     /* FALL THROUGH */
  2079.  
  2080.     default:
  2081.     if (SvGMAGICAL(sstr)) {
  2082.         mg_get(sstr);
  2083.         if (SvTYPE(sstr) != stype) {
  2084.         stype = SvTYPE(sstr);
  2085.         if (stype == SVt_PVGV && dtype <= SVt_PVGV)
  2086.             goto glob_assign;
  2087.         }
  2088.     }
  2089.     if (stype == SVt_PVLV)
  2090.         SvUPGRADE(dstr, SVt_PVNV);
  2091.     else
  2092.         SvUPGRADE(dstr, stype);
  2093.     }
  2094.  
  2095.     sflags = SvFLAGS(sstr);
  2096.  
  2097.     if (sflags & SVf_ROK) {
  2098.     if (dtype >= SVt_PV) {
  2099.         if (dtype == SVt_PVGV) {
  2100.         dTHR;
  2101.         SV *sref = SvREFCNT_inc(SvRV(sstr));
  2102.         SV *dref = 0;
  2103.         int intro = GvINTRO(dstr);
  2104.  
  2105.         if (intro) {
  2106.             GP *gp;
  2107.             GvGP(dstr)->gp_refcnt--;
  2108.             GvINTRO_off(dstr);    /* one-shot flag */
  2109.             Newz(602,gp, 1, GP);
  2110.             GvGP(dstr) = gp_ref(gp);
  2111.             GvSV(dstr) = NEWSV(72,0);
  2112.             GvLINE(dstr) = PL_curcop->cop_line;
  2113.             GvEGV(dstr) = (GV*)dstr;
  2114.         }
  2115.         GvMULTI_on(dstr);
  2116.         switch (SvTYPE(sref)) {
  2117.         case SVt_PVAV:
  2118.             if (intro)
  2119.             SAVESPTR(GvAV(dstr));
  2120.             else
  2121.             dref = (SV*)GvAV(dstr);
  2122.             GvAV(dstr) = (AV*)sref;
  2123.             if (PL_curcop->cop_stash != GvSTASH(dstr))
  2124.             GvIMPORTED_AV_on(dstr);
  2125.             break;
  2126.         case SVt_PVHV:
  2127.             if (intro)
  2128.             SAVESPTR(GvHV(dstr));
  2129.             else
  2130.             dref = (SV*)GvHV(dstr);
  2131.             GvHV(dstr) = (HV*)sref;
  2132.             if (PL_curcop->cop_stash != GvSTASH(dstr))
  2133.             GvIMPORTED_HV_on(dstr);
  2134.             break;
  2135.         case SVt_PVCV:
  2136.             if (intro) {
  2137.             if (GvCVGEN(dstr) && GvCV(dstr) != (CV*)sref) {
  2138.                 SvREFCNT_dec(GvCV(dstr));
  2139.                 GvCV(dstr) = Nullcv;
  2140.                 GvCVGEN(dstr) = 0; /* Switch off cacheness. */
  2141.                 PL_sub_generation++;
  2142.             }
  2143.             SAVESPTR(GvCV(dstr));
  2144.             }
  2145.             else
  2146.             dref = (SV*)GvCV(dstr);
  2147.             if (GvCV(dstr) != (CV*)sref) {
  2148.             CV* cv = GvCV(dstr);
  2149.             if (cv) {
  2150.                 if (!GvCVGEN((GV*)dstr) &&
  2151.                 (CvROOT(cv) || CvXSUB(cv)))
  2152.                 {
  2153.                 SV *const_sv = cv_const_sv(cv);
  2154.                 bool const_changed = TRUE; 
  2155.                 if(const_sv)
  2156.                     const_changed = sv_cmp(const_sv, 
  2157.                        op_const_sv(CvSTART((CV*)sref), 
  2158.                                Nullcv));
  2159.                 /* ahem, death to those who redefine
  2160.                  * active sort subs */
  2161.                 if (PL_curstackinfo->si_type == PERLSI_SORT &&
  2162.                       PL_sortcop == CvSTART(cv))
  2163.                     croak(
  2164.                     "Can't redefine active sort subroutine %s",
  2165.                       GvENAME((GV*)dstr));
  2166.                 if (PL_dowarn || (const_changed && const_sv)) {
  2167.                     if (!(CvGV(cv) && GvSTASH(CvGV(cv))
  2168.                       && HvNAME(GvSTASH(CvGV(cv)))
  2169.                       && strEQ(HvNAME(GvSTASH(CvGV(cv))),
  2170.                            "autouse")))
  2171.                     warn(const_sv ? 
  2172.                          "Constant subroutine %s redefined"
  2173.                          : "Subroutine %s redefined", 
  2174.                          GvENAME((GV*)dstr));
  2175.                 }
  2176.                 }
  2177.                 cv_ckproto(cv, (GV*)dstr,
  2178.                        SvPOK(sref) ? SvPVX(sref) : Nullch);
  2179.             }
  2180.             GvCV(dstr) = (CV*)sref;
  2181.             GvCVGEN(dstr) = 0; /* Switch off cacheness. */
  2182.             GvASSUMECV_on(dstr);
  2183.             PL_sub_generation++;
  2184.             }
  2185.             if (PL_curcop->cop_stash != GvSTASH(dstr))
  2186.             GvIMPORTED_CV_on(dstr);
  2187.             break;
  2188.         case SVt_PVIO:
  2189.             if (intro)
  2190.             SAVESPTR(GvIOp(dstr));
  2191.             else
  2192.             dref = (SV*)GvIOp(dstr);
  2193.             GvIOp(dstr) = (IO*)sref;
  2194.             break;
  2195.         default:
  2196.             if (intro)
  2197.             SAVESPTR(GvSV(dstr));
  2198.             else
  2199.             dref = (SV*)GvSV(dstr);
  2200.             GvSV(dstr) = sref;
  2201.             if (PL_curcop->cop_stash != GvSTASH(dstr))
  2202.             GvIMPORTED_SV_on(dstr);
  2203.             break;
  2204.         }
  2205.         if (dref)
  2206.             SvREFCNT_dec(dref);
  2207.         if (intro)
  2208.             SAVEFREESV(sref);
  2209.         SvTAINT(dstr);
  2210.         return;
  2211.         }
  2212.         if (SvPVX(dstr)) {
  2213.         (void)SvOOK_off(dstr);        /* backoff */
  2214.         Safefree(SvPVX(dstr));
  2215.         SvLEN(dstr)=SvCUR(dstr)=0;
  2216.         }
  2217.     }
  2218.     (void)SvOK_off(dstr);
  2219.     SvRV(dstr) = SvREFCNT_inc(SvRV(sstr));
  2220.     SvROK_on(dstr);
  2221.     if (sflags & SVp_NOK) {
  2222.         SvNOK_on(dstr);
  2223.         SvNVX(dstr) = SvNVX(sstr);
  2224.     }
  2225.     if (sflags & SVp_IOK) {
  2226.         (void)SvIOK_on(dstr);
  2227.         SvIVX(dstr) = SvIVX(sstr);
  2228.     }
  2229. #ifdef OVERLOAD
  2230.     if (SvAMAGIC(sstr)) {
  2231.         SvAMAGIC_on(dstr);
  2232.     }
  2233. #endif /* OVERLOAD */
  2234.     }
  2235.     else if (sflags & SVp_POK) {
  2236.  
  2237.     /*
  2238.      * Check to see if we can just swipe the string.  If so, it's a
  2239.      * possible small lose on short strings, but a big win on long ones.
  2240.      * It might even be a win on short strings if SvPVX(dstr)
  2241.      * has to be allocated and SvPVX(sstr) has to be freed.
  2242.      */
  2243.  
  2244.     if (SvTEMP(sstr) &&        /* slated for free anyway? */
  2245.         SvREFCNT(sstr) == 1 &&     /* and no other references to it? */
  2246.         !(sflags & SVf_OOK))     /* and not involved in OOK hack? */
  2247.     {
  2248.         if (SvPVX(dstr)) {        /* we know that dtype >= SVt_PV */
  2249.         if (SvOOK(dstr)) {
  2250.             SvFLAGS(dstr) &= ~SVf_OOK;
  2251.             Safefree(SvPVX(dstr) - SvIVX(dstr));
  2252.         }
  2253.         else
  2254.             Safefree(SvPVX(dstr));
  2255.         }
  2256.         (void)SvPOK_only(dstr);
  2257.         SvPV_set(dstr, SvPVX(sstr));
  2258.         SvLEN_set(dstr, SvLEN(sstr));
  2259.         SvCUR_set(dstr, SvCUR(sstr));
  2260.         SvTEMP_off(dstr);
  2261.         (void)SvOK_off(sstr);
  2262.         SvPV_set(sstr, Nullch);
  2263.         SvLEN_set(sstr, 0);
  2264.         SvCUR_set(sstr, 0);
  2265.         SvTEMP_off(sstr);
  2266.     }
  2267.     else {                    /* have to copy actual string */
  2268.         STRLEN len = SvCUR(sstr);
  2269.  
  2270.         SvGROW(dstr, len + 1);        /* inlined from sv_setpvn */
  2271.         Move(SvPVX(sstr),SvPVX(dstr),len,char);
  2272.         SvCUR_set(dstr, len);
  2273.         *SvEND(dstr) = '\0';
  2274.         (void)SvPOK_only(dstr);
  2275.     }
  2276.     /*SUPPRESS 560*/
  2277.     if (sflags & SVp_NOK) {
  2278.         SvNOK_on(dstr);
  2279.         SvNVX(dstr) = SvNVX(sstr);
  2280.     }
  2281.     if (sflags & SVp_IOK) {
  2282.         (void)SvIOK_on(dstr);
  2283.         SvIVX(dstr) = SvIVX(sstr);
  2284.     }
  2285.     }
  2286.     else if (sflags & SVp_NOK) {
  2287.     SvNVX(dstr) = SvNVX(sstr);
  2288.     (void)SvNOK_only(dstr);
  2289.     if (SvIOK(sstr)) {
  2290.         (void)SvIOK_on(dstr);
  2291.         SvIVX(dstr) = SvIVX(sstr);
  2292.     }
  2293.     }
  2294.     else if (sflags & SVp_IOK) {
  2295.     (void)SvIOK_only(dstr);
  2296.     SvIVX(dstr) = SvIVX(sstr);
  2297.     }
  2298.     else {
  2299.     if (dtype == SVt_PVGV) {
  2300.         if (PL_dowarn)
  2301.         warn("Undefined value assigned to typeglob");
  2302.     }
  2303.     else
  2304.         (void)SvOK_off(dstr);
  2305.     }
  2306.     SvTAINT(dstr);
  2307. }
  2308.  
  2309. void
  2310. sv_setsv_mg(SV *dstr, register SV *sstr)
  2311. {
  2312.     sv_setsv(dstr,sstr);
  2313.     SvSETMAGIC(dstr);
  2314. }
  2315.  
  2316. void
  2317. sv_setpvn(register SV *sv, register const char *ptr, register STRLEN len)
  2318. {
  2319.     register char *dptr;
  2320.     assert(len >= 0);  /* STRLEN is probably unsigned, so this may
  2321.               elicit a warning, but it won't hurt. */
  2322.     SV_CHECK_THINKFIRST(sv);
  2323.     if (!ptr) {
  2324.     (void)SvOK_off(sv);
  2325.     return;
  2326.     }
  2327.     if (SvTYPE(sv) >= SVt_PV) {
  2328.     if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
  2329.         sv_unglob(sv);
  2330.     }
  2331.     else
  2332.     sv_upgrade(sv, SVt_PV);
  2333.  
  2334.     SvGROW(sv, len + 1);
  2335.     dptr = SvPVX(sv);
  2336.     Move(ptr,dptr,len,char);
  2337.     dptr[len] = '\0';
  2338.     SvCUR_set(sv, len);
  2339.     (void)SvPOK_only(sv);        /* validate pointer */
  2340.     SvTAINT(sv);
  2341. }
  2342.  
  2343. void
  2344. sv_setpvn_mg(register SV *sv, register const char *ptr, register STRLEN len)
  2345. {
  2346.     sv_setpvn(sv,ptr,len);
  2347.     SvSETMAGIC(sv);
  2348. }
  2349.  
  2350. void
  2351. sv_setpv(register SV *sv, register const char *ptr)
  2352. {
  2353.     register STRLEN len;
  2354.  
  2355.     SV_CHECK_THINKFIRST(sv);
  2356.     if (!ptr) {
  2357.     (void)SvOK_off(sv);
  2358.     return;
  2359.     }
  2360.     len = strlen(ptr);
  2361.     if (SvTYPE(sv) >= SVt_PV) {
  2362.     if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV)
  2363.         sv_unglob(sv);
  2364.     }
  2365.     else 
  2366.     sv_upgrade(sv, SVt_PV);
  2367.  
  2368.     SvGROW(sv, len + 1);
  2369.     Move(ptr,SvPVX(sv),len+1,char);
  2370.     SvCUR_set(sv, len);
  2371.     (void)SvPOK_only(sv);        /* validate pointer */
  2372.     SvTAINT(sv);
  2373. }
  2374.  
  2375. void
  2376. sv_setpv_mg(register SV *sv, register const char *ptr)
  2377. {
  2378.     sv_setpv(sv,ptr);
  2379.     SvSETMAGIC(sv);
  2380. }
  2381.  
  2382. void
  2383. sv_usepvn(register SV *sv, register char *ptr, register STRLEN len)
  2384. {
  2385.     SV_CHECK_THINKFIRST(sv);
  2386.     (void)SvUPGRADE(sv, SVt_PV);
  2387.     if (!ptr) {
  2388.     (void)SvOK_off(sv);
  2389.     return;
  2390.     }
  2391.     if (SvPVX(sv))
  2392.     Safefree(SvPVX(sv));
  2393.     Renew(ptr, len+1, char);
  2394.     SvPVX(sv) = ptr;
  2395.     SvCUR_set(sv, len);
  2396.     SvLEN_set(sv, len+1);
  2397.     *SvEND(sv) = '\0';
  2398.     (void)SvPOK_only(sv);        /* validate pointer */
  2399.     SvTAINT(sv);
  2400. }
  2401.  
  2402. void
  2403. sv_usepvn_mg(register SV *sv, register char *ptr, register STRLEN len)
  2404. {
  2405.     sv_usepvn(sv,ptr,len);
  2406.     SvSETMAGIC(sv);
  2407. }
  2408.  
  2409. STATIC void
  2410. sv_check_thinkfirst(register SV *sv)
  2411. {
  2412.     if (SvREADONLY(sv)) {
  2413.     dTHR;
  2414.     if (PL_curcop != &PL_compiling)
  2415.         croak(no_modify);
  2416.     }
  2417.     if (SvROK(sv))
  2418.     sv_unref(sv);
  2419. }
  2420.     
  2421. void
  2422. sv_chop(register SV *sv, register char *ptr)    /* like set but assuming ptr is in sv */
  2423.                 
  2424.                    
  2425. {
  2426.     register STRLEN delta;
  2427.  
  2428.     if (!ptr || !SvPOKp(sv))
  2429.     return;
  2430.     SV_CHECK_THINKFIRST(sv);
  2431.     if (SvTYPE(sv) < SVt_PVIV)
  2432.     sv_upgrade(sv,SVt_PVIV);
  2433.  
  2434.     if (!SvOOK(sv)) {
  2435.     SvIVX(sv) = 0;
  2436.     SvFLAGS(sv) |= SVf_OOK;
  2437.     }
  2438.     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVp_IOK|SVp_NOK);
  2439.     delta = ptr - SvPVX(sv);
  2440.     SvLEN(sv) -= delta;
  2441.     SvCUR(sv) -= delta;
  2442.     SvPVX(sv) += delta;
  2443.     SvIVX(sv) += delta;
  2444. }
  2445.  
  2446. void
  2447. sv_catpvn(register SV *sv, register char *ptr, register STRLEN len)
  2448. {
  2449.     STRLEN tlen;
  2450.     char *junk;
  2451.  
  2452.     junk = SvPV_force(sv, tlen);
  2453.     SvGROW(sv, tlen + len + 1);
  2454.     if (ptr == junk)
  2455.     ptr = SvPVX(sv);
  2456.     Move(ptr,SvPVX(sv)+tlen,len,char);
  2457.     SvCUR(sv) += len;
  2458.     *SvEND(sv) = '\0';
  2459.     (void)SvPOK_only(sv);        /* validate pointer */
  2460.     SvTAINT(sv);
  2461. }
  2462.  
  2463. void
  2464. sv_catpvn_mg(register SV *sv, register char *ptr, register STRLEN len)
  2465. {
  2466.     sv_catpvn(sv,ptr,len);
  2467.     SvSETMAGIC(sv);
  2468. }
  2469.  
  2470. void
  2471. sv_catsv(SV *dstr, register SV *sstr)
  2472. {
  2473.     char *s;
  2474.     STRLEN len;
  2475.     if (!sstr)
  2476.     return;
  2477.     if (s = SvPV(sstr, len))
  2478.     sv_catpvn(dstr,s,len);
  2479. }
  2480.  
  2481. void
  2482. sv_catsv_mg(SV *dstr, register SV *sstr)
  2483. {
  2484.     sv_catsv(dstr,sstr);
  2485.     SvSETMAGIC(dstr);
  2486. }
  2487.  
  2488. void
  2489. sv_catpv(register SV *sv, register char *ptr)
  2490. {
  2491.     register STRLEN len;
  2492.     STRLEN tlen;
  2493.     char *junk;
  2494.  
  2495.     if (!ptr)
  2496.     return;
  2497.     junk = SvPV_force(sv, tlen);
  2498.     len = strlen(ptr);
  2499.     SvGROW(sv, tlen + len + 1);
  2500.     if (ptr == junk)
  2501.     ptr = SvPVX(sv);
  2502.     Move(ptr,SvPVX(sv)+tlen,len+1,char);
  2503.     SvCUR(sv) += len;
  2504.     (void)SvPOK_only(sv);        /* validate pointer */
  2505.     SvTAINT(sv);
  2506. }
  2507.  
  2508. void
  2509. sv_catpv_mg(register SV *sv, register char *ptr)
  2510. {
  2511.     sv_catpv(sv,ptr);
  2512.     SvSETMAGIC(sv);
  2513. }
  2514.  
  2515. SV *
  2516. newSV(STRLEN len)
  2517. {
  2518.     register SV *sv;
  2519.     
  2520.     new_SV(sv);
  2521.     SvANY(sv) = 0;
  2522.     SvREFCNT(sv) = 1;
  2523.     SvFLAGS(sv) = 0;
  2524.     if (len) {
  2525.     sv_upgrade(sv, SVt_PV);
  2526.     SvGROW(sv, len + 1);
  2527.     }
  2528.     return sv;
  2529. }
  2530.  
  2531. /* name is assumed to contain an SV* if (name && namelen == HEf_SVKEY) */
  2532.  
  2533. void
  2534. sv_magic(register SV *sv, SV *obj, int how, char *name, I32 namlen)
  2535. {
  2536.     MAGIC* mg;
  2537.     
  2538.     if (SvREADONLY(sv)) {
  2539.     dTHR;
  2540.     if (PL_curcop != &PL_compiling && !strchr("gBf", how))
  2541.         croak(no_modify);
  2542.     }
  2543.     if (SvMAGICAL(sv) || (how == 't' && SvTYPE(sv) >= SVt_PVMG)) {
  2544.     if (SvMAGIC(sv) && (mg = mg_find(sv, how))) {
  2545.         if (how == 't')
  2546.         mg->mg_len |= 1;
  2547.         return;
  2548.     }
  2549.     }
  2550.     else {
  2551.         (void)SvUPGRADE(sv, SVt_PVMG);
  2552.     }
  2553.     Newz(702,mg, 1, MAGIC);
  2554.     mg->mg_moremagic = SvMAGIC(sv);
  2555.  
  2556.     SvMAGIC(sv) = mg;
  2557.     if (!obj || obj == sv || how == '#' || how == 'r')
  2558.     mg->mg_obj = obj;
  2559.     else {
  2560.     dTHR;
  2561.     mg->mg_obj = SvREFCNT_inc(obj);
  2562.     mg->mg_flags |= MGf_REFCOUNTED;
  2563.     }
  2564.     mg->mg_type = how;
  2565.     mg->mg_len = namlen;
  2566.     if (name)
  2567.     if (namlen >= 0)
  2568.         mg->mg_ptr = savepvn(name, namlen);
  2569.     else if (namlen == HEf_SVKEY)
  2570.         mg->mg_ptr = (char*)SvREFCNT_inc((SV*)name);
  2571.     
  2572.     switch (how) {
  2573.     case 0:
  2574.     mg->mg_virtual = &vtbl_sv;
  2575.     break;
  2576. #ifdef OVERLOAD
  2577.     case 'A':
  2578.         mg->mg_virtual = &vtbl_amagic;
  2579.         break;
  2580.     case 'a':
  2581.         mg->mg_virtual = &vtbl_amagicelem;
  2582.         break;
  2583.     case 'c':
  2584.         mg->mg_virtual = 0;
  2585.         break;
  2586. #endif /* OVERLOAD */
  2587.     case 'B':
  2588.     mg->mg_virtual = &vtbl_bm;
  2589.     break;
  2590.     case 'E':
  2591.     mg->mg_virtual = &vtbl_env;
  2592.     break;
  2593.     case 'f':
  2594.     mg->mg_virtual = &vtbl_fm;
  2595.     break;
  2596.     case 'e':
  2597.     mg->mg_virtual = &vtbl_envelem;
  2598.     break;
  2599.     case 'g':
  2600.     mg->mg_virtual = &vtbl_mglob;
  2601.     break;
  2602.     case 'I':
  2603.     mg->mg_virtual = &vtbl_isa;
  2604.     break;
  2605.     case 'i':
  2606.     mg->mg_virtual = &vtbl_isaelem;
  2607.     break;
  2608.     case 'k':
  2609.     mg->mg_virtual = &vtbl_nkeys;
  2610.     break;
  2611.     case 'L':
  2612.     SvRMAGICAL_on(sv);
  2613.     mg->mg_virtual = 0;
  2614.     break;
  2615.     case 'l':
  2616.     mg->mg_virtual = &vtbl_dbline;
  2617.     break;
  2618. #ifdef USE_THREADS
  2619.     case 'm':
  2620.     mg->mg_virtual = &vtbl_mutex;
  2621.     break;
  2622. #endif /* USE_THREADS */
  2623. #ifdef USE_LOCALE_COLLATE
  2624.     case 'o':
  2625.         mg->mg_virtual = &vtbl_collxfrm;
  2626.         break;
  2627. #endif /* USE_LOCALE_COLLATE */
  2628.     case 'P':
  2629.     mg->mg_virtual = &vtbl_pack;
  2630.     break;
  2631.     case 'p':
  2632.     case 'q':
  2633.     mg->mg_virtual = &vtbl_packelem;
  2634.     break;
  2635.     case 'r':
  2636.     mg->mg_virtual = &vtbl_regexp;
  2637.     break;
  2638.     case 'S':
  2639.     mg->mg_virtual = &vtbl_sig;
  2640.     break;
  2641.     case 's':
  2642.     mg->mg_virtual = &vtbl_sigelem;
  2643.     break;
  2644.     case 't':
  2645.     mg->mg_virtual = &vtbl_taint;
  2646.     mg->mg_len = 1;
  2647.     break;
  2648.     case 'U':
  2649.     mg->mg_virtual = &vtbl_uvar;
  2650.     break;
  2651.     case 'v':
  2652.     mg->mg_virtual = &vtbl_vec;
  2653.     break;
  2654.     case 'x':
  2655.     mg->mg_virtual = &vtbl_substr;
  2656.     break;
  2657.     case 'y':
  2658.     mg->mg_virtual = &vtbl_defelem;
  2659.     break;
  2660.     case '*':
  2661.     mg->mg_virtual = &vtbl_glob;
  2662.     break;
  2663.     case '#':
  2664.     mg->mg_virtual = &vtbl_arylen;
  2665.     break;
  2666.     case '.':
  2667.     mg->mg_virtual = &vtbl_pos;
  2668.     break;
  2669.     case '~':    /* Reserved for use by extensions not perl internals.    */
  2670.     /* Useful for attaching extension internal data to perl vars.    */
  2671.     /* Note that multiple extensions may clash if magical scalars    */
  2672.     /* etc holding private data from one are passed to another.    */
  2673.     SvRMAGICAL_on(sv);
  2674.     break;
  2675.     default:
  2676.     croak("Don't know how to handle magic of type '%c'", how);
  2677.     }
  2678.     mg_magical(sv);
  2679.     if (SvGMAGICAL(sv))
  2680.     SvFLAGS(sv) &= ~(SVf_IOK|SVf_NOK|SVf_POK);
  2681. }
  2682.  
  2683. int
  2684. sv_unmagic(SV *sv, int type)
  2685. {
  2686.     MAGIC* mg;
  2687.     MAGIC** mgp;
  2688.     if (SvTYPE(sv) < SVt_PVMG || !SvMAGIC(sv))
  2689.     return 0;
  2690.     mgp = &SvMAGIC(sv);
  2691.     for (mg = *mgp; mg; mg = *mgp) {
  2692.     if (mg->mg_type == type) {
  2693.         MGVTBL* vtbl = mg->mg_virtual;
  2694.         *mgp = mg->mg_moremagic;
  2695.         if (vtbl && (vtbl->svt_free != NULL))
  2696.         (VTBL->svt_free)(sv, mg);
  2697.         if (mg->mg_ptr && mg->mg_type != 'g')
  2698.         if (mg->mg_len >= 0)
  2699.             Safefree(mg->mg_ptr);
  2700.         else if (mg->mg_len == HEf_SVKEY)
  2701.             SvREFCNT_dec((SV*)mg->mg_ptr);
  2702.         if (mg->mg_flags & MGf_REFCOUNTED)
  2703.         SvREFCNT_dec(mg->mg_obj);
  2704.         Safefree(mg);
  2705.     }
  2706.     else
  2707.         mgp = &mg->mg_moremagic;
  2708.     }
  2709.     if (!SvMAGIC(sv)) {
  2710.     SvMAGICAL_off(sv);
  2711.     SvFLAGS(sv) |= (SvFLAGS(sv) & (SVp_IOK|SVp_NOK|SVp_POK)) >> PRIVSHIFT;
  2712.     }
  2713.  
  2714.     return 0;
  2715. }
  2716.  
  2717. void
  2718. sv_insert(SV *bigstr, STRLEN offset, STRLEN len, char *little, STRLEN littlelen)
  2719. {
  2720.     register char *big;
  2721.     register char *mid;
  2722.     register char *midend;
  2723.     register char *bigend;
  2724.     register I32 i;
  2725.     STRLEN curlen;
  2726.     
  2727.  
  2728.     if (!bigstr)
  2729.     croak("Can't modify non-existent substring");
  2730.     SvPV_force(bigstr, curlen);
  2731.     if (offset + len > curlen) {
  2732.     SvGROW(bigstr, offset+len+1);
  2733.     Zero(SvPVX(bigstr)+curlen, offset+len-curlen, char);
  2734.     SvCUR_set(bigstr, offset+len);
  2735.     }
  2736.  
  2737.     i = littlelen - len;
  2738.     if (i > 0) {            /* string might grow */
  2739.     big = SvGROW(bigstr, SvCUR(bigstr) + i + 1);
  2740.     mid = big + offset + len;
  2741.     midend = bigend = big + SvCUR(bigstr);
  2742.     bigend += i;
  2743.     *bigend = '\0';
  2744.     while (midend > mid)        /* shove everything down */
  2745.         *--bigend = *--midend;
  2746.     Move(little,big+offset,littlelen,char);
  2747.     SvCUR(bigstr) += i;
  2748.     SvSETMAGIC(bigstr);
  2749.     return;
  2750.     }
  2751.     else if (i == 0) {
  2752.     Move(little,SvPVX(bigstr)+offset,len,char);
  2753.     SvSETMAGIC(bigstr);
  2754.     return;
  2755.     }
  2756.  
  2757.     big = SvPVX(bigstr);
  2758.     mid = big + offset;
  2759.     midend = mid + len;
  2760.     bigend = big + SvCUR(bigstr);
  2761.  
  2762.     if (midend > bigend)
  2763.     croak("panic: sv_insert");
  2764.  
  2765.     if (mid - big > bigend - midend) {    /* faster to shorten from end */
  2766.     if (littlelen) {
  2767.         Move(little, mid, littlelen,char);
  2768.         mid += littlelen;
  2769.     }
  2770.     i = bigend - midend;
  2771.     if (i > 0) {
  2772.         Move(midend, mid, i,char);
  2773.         mid += i;
  2774.     }
  2775.     *mid = '\0';
  2776.     SvCUR_set(bigstr, mid - big);
  2777.     }
  2778.     /*SUPPRESS 560*/
  2779.     else if (i = mid - big) {    /* faster from front */
  2780.     midend -= littlelen;
  2781.     mid = midend;
  2782.     sv_chop(bigstr,midend-i);
  2783.     big += i;
  2784.     while (i--)
  2785.         *--midend = *--big;
  2786.     if (littlelen)
  2787.         Move(little, mid, littlelen,char);
  2788.     }
  2789.     else if (littlelen) {
  2790.     midend -= littlelen;
  2791.     sv_chop(bigstr,midend);
  2792.     Move(little,midend,littlelen,char);
  2793.     }
  2794.     else {
  2795.     sv_chop(bigstr,midend);
  2796.     }
  2797.     SvSETMAGIC(bigstr);
  2798. }
  2799.  
  2800. /* make sv point to what nstr did */
  2801.  
  2802. void
  2803. sv_replace(register SV *sv, register SV *nsv)
  2804. {
  2805.     U32 refcnt = SvREFCNT(sv);
  2806.     SV_CHECK_THINKFIRST(sv);
  2807.     if (SvREFCNT(nsv) != 1)
  2808.     warn("Reference miscount in sv_replace()");
  2809.     if (SvMAGICAL(sv)) {
  2810.     if (SvMAGICAL(nsv))
  2811.         mg_free(nsv);
  2812.     else
  2813.         sv_upgrade(nsv, SVt_PVMG);
  2814.     SvMAGIC(nsv) = SvMAGIC(sv);
  2815.     SvFLAGS(nsv) |= SvMAGICAL(sv);
  2816.     SvMAGICAL_off(sv);
  2817.     SvMAGIC(sv) = 0;
  2818.     }
  2819.     SvREFCNT(sv) = 0;
  2820.     sv_clear(sv);
  2821.     assert(!SvREFCNT(sv));
  2822.     StructCopy(nsv,sv,SV);
  2823.     SvREFCNT(sv) = refcnt;
  2824.     SvFLAGS(nsv) |= SVTYPEMASK;        /* Mark as freed */
  2825.     del_SV(nsv);
  2826. }
  2827.  
  2828. void
  2829. sv_clear(register SV *sv)
  2830. {
  2831.     HV* stash;
  2832.     assert(sv);
  2833.     assert(SvREFCNT(sv) == 0);
  2834.  
  2835.     if (SvOBJECT(sv)) {
  2836.     dTHR;
  2837.     if (PL_defstash) {        /* Still have a symbol table? */
  2838.         djSP;
  2839.         GV* destructor;
  2840.         SV tmpref;
  2841.  
  2842.         Zero(&tmpref, 1, SV);
  2843.         sv_upgrade(&tmpref, SVt_RV);
  2844.         SvROK_on(&tmpref);
  2845.         SvREADONLY_on(&tmpref);    /* DESTROY() could be naughty */
  2846.         SvREFCNT(&tmpref) = 1;
  2847.  
  2848.         do {
  2849.         stash = SvSTASH(sv);
  2850.         destructor = gv_fetchmethod(SvSTASH(sv), "DESTROY");
  2851.         if (destructor) {
  2852.             ENTER;
  2853.             PUSHSTACKi(PERLSI_DESTROY);
  2854.             SvRV(&tmpref) = SvREFCNT_inc(sv);
  2855.             EXTEND(SP, 2);
  2856.             PUSHMARK(SP);
  2857.             PUSHs(&tmpref);
  2858.             PUTBACK;
  2859.             perl_call_sv((SV*)GvCV(destructor),
  2860.                  G_DISCARD|G_EVAL|G_KEEPERR);
  2861.             SvREFCNT(sv)--;
  2862.             POPSTACK;
  2863.             LEAVE;
  2864.         }
  2865.         } while (SvOBJECT(sv) && SvSTASH(sv) != stash);
  2866.  
  2867.         del_XRV(SvANY(&tmpref));
  2868.     }
  2869.  
  2870.     if (SvOBJECT(sv)) {
  2871.         SvREFCNT_dec(SvSTASH(sv));    /* possibly of changed persuasion */
  2872.         SvOBJECT_off(sv);    /* Curse the object. */
  2873.         if (SvTYPE(sv) != SVt_PVIO)
  2874.         --PL_sv_objcount;    /* XXX Might want something more general */
  2875.     }
  2876.     if (SvREFCNT(sv)) {
  2877.         if (PL_in_clean_objs)
  2878.             croak("DESTROY created new reference to dead object");
  2879.         /* DESTROY gave object new lease on life */
  2880.         return;
  2881.     }
  2882.     }
  2883.     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv))
  2884.     mg_free(sv);
  2885.     stash = NULL;
  2886.     switch (SvTYPE(sv)) {
  2887.     case SVt_PVIO:
  2888.     if (IoIFP(sv) != PerlIO_stdin() &&
  2889.         IoIFP(sv) != PerlIO_stdout() &&
  2890.         IoIFP(sv) != PerlIO_stderr())
  2891.       io_close((IO*)sv);
  2892.     Safefree(IoTOP_NAME(sv));
  2893.     Safefree(IoFMT_NAME(sv));
  2894.     Safefree(IoBOTTOM_NAME(sv));
  2895.     /* FALL THROUGH */
  2896.     case SVt_PVBM:
  2897.     goto freescalar;
  2898.     case SVt_PVCV:
  2899.     case SVt_PVFM:
  2900.     cv_undef((CV*)sv);
  2901.     goto freescalar;
  2902.     case SVt_PVHV:
  2903.     hv_undef((HV*)sv);
  2904.     break;
  2905.     case SVt_PVAV:
  2906.     av_undef((AV*)sv);
  2907.     break;
  2908.     case SVt_PVLV:
  2909.     SvREFCNT_dec(LvTARG(sv));
  2910.     goto freescalar;
  2911.     case SVt_PVGV:
  2912.     gp_free((GV*)sv);
  2913.     Safefree(GvNAME(sv));
  2914.     /* cannot decrease stash refcount yet, as we might recursively delete
  2915.        ourselves when the refcnt drops to zero. Delay SvREFCNT_dec
  2916.        of stash until current sv is completely gone.
  2917.        -- JohnPC, 27 Mar 1998 */
  2918.     stash = GvSTASH(sv);
  2919.     /* FALL THROUGH */
  2920.     case SVt_PVMG:
  2921.     case SVt_PVNV:
  2922.     case SVt_PVIV:
  2923.       freescalar:
  2924.     (void)SvOOK_off(sv);
  2925.     /* FALL THROUGH */
  2926.     case SVt_PV:
  2927.     case SVt_RV:
  2928.     if (SvROK(sv))
  2929.         SvREFCNT_dec(SvRV(sv));
  2930.     else if (SvPVX(sv) && SvLEN(sv))
  2931.         Safefree(SvPVX(sv));
  2932.     break;
  2933. /*
  2934.     case SVt_NV:
  2935.     case SVt_IV:
  2936.     case SVt_NULL:
  2937.     break;
  2938. */
  2939.     }
  2940.  
  2941.     switch (SvTYPE(sv)) {
  2942.     case SVt_NULL:
  2943.     break;
  2944.     case SVt_IV:
  2945.     del_XIV(SvANY(sv));
  2946.     break;
  2947.     case SVt_NV:
  2948.     del_XNV(SvANY(sv));
  2949.     break;
  2950.     case SVt_RV:
  2951.     del_XRV(SvANY(sv));
  2952.     break;
  2953.     case SVt_PV:
  2954.     del_XPV(SvANY(sv));
  2955.     break;
  2956.     case SVt_PVIV:
  2957.     del_XPVIV(SvANY(sv));
  2958.     break;
  2959.     case SVt_PVNV:
  2960.     del_XPVNV(SvANY(sv));
  2961.     break;
  2962.     case SVt_PVMG:
  2963.     del_XPVMG(SvANY(sv));
  2964.     break;
  2965.     case SVt_PVLV:
  2966.     del_XPVLV(SvANY(sv));
  2967.     break;
  2968.     case SVt_PVAV:
  2969.     del_XPVAV(SvANY(sv));
  2970.     break;
  2971.     case SVt_PVHV:
  2972.     del_XPVHV(SvANY(sv));
  2973.     break;
  2974.     case SVt_PVCV:
  2975.     del_XPVCV(SvANY(sv));
  2976.     break;
  2977.     case SVt_PVGV:
  2978.     del_XPVGV(SvANY(sv));
  2979.     /* code duplication for increased performance. */
  2980.     SvFLAGS(sv) &= SVf_BREAK;
  2981.     SvFLAGS(sv) |= SVTYPEMASK;
  2982.     /* decrease refcount of the stash that owns this GV, if any */
  2983.     if (stash)
  2984.         SvREFCNT_dec(stash);
  2985.     return; /* not break, SvFLAGS reset already happened */
  2986.     case SVt_PVBM:
  2987.     del_XPVBM(SvANY(sv));
  2988.     break;
  2989.     case SVt_PVFM:
  2990.     del_XPVFM(SvANY(sv));
  2991.     break;
  2992.     case SVt_PVIO:
  2993.     del_XPVIO(SvANY(sv));
  2994.     break;
  2995.     }
  2996.     SvFLAGS(sv) &= SVf_BREAK;
  2997.     SvFLAGS(sv) |= SVTYPEMASK;
  2998. }
  2999.  
  3000. SV *
  3001. sv_newref(SV *sv)
  3002. {
  3003.     if (sv)
  3004.     ATOMIC_INC(SvREFCNT(sv));
  3005.     return sv;
  3006. }
  3007.  
  3008. void
  3009. sv_free(SV *sv)
  3010. {
  3011.     int refcount_is_zero;
  3012.  
  3013.     if (!sv)
  3014.     return;
  3015.     if (SvREFCNT(sv) == 0) {
  3016.     if (SvFLAGS(sv) & SVf_BREAK)
  3017.         return;
  3018.     if (PL_in_clean_all) /* All is fair */
  3019.         return;
  3020.     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
  3021.         /* make sure SvREFCNT(sv)==0 happens very seldom */
  3022.         SvREFCNT(sv) = (~(U32)0)/2;
  3023.         return;
  3024.     }
  3025.     warn("Attempt to free unreferenced scalar");
  3026.     return;
  3027.     }
  3028.     ATOMIC_DEC_AND_TEST(refcount_is_zero, SvREFCNT(sv));
  3029.     if (!refcount_is_zero)
  3030.     return;
  3031. #ifdef DEBUGGING
  3032.     if (SvTEMP(sv)) {
  3033.     warn("Attempt to free temp prematurely: SV 0x%lx", (unsigned long)sv);
  3034.     return;
  3035.     }
  3036. #endif
  3037.     if (SvREADONLY(sv) && SvIMMORTAL(sv)) {
  3038.     /* make sure SvREFCNT(sv)==0 happens very seldom */
  3039.     SvREFCNT(sv) = (~(U32)0)/2;
  3040.     return;
  3041.     }
  3042.     sv_clear(sv);
  3043.     if (! SvREFCNT(sv))
  3044.     del_SV(sv);
  3045. }
  3046.  
  3047. STRLEN
  3048. sv_len(register SV *sv)
  3049. {
  3050.     char *junk;
  3051.     STRLEN len;
  3052.  
  3053.     if (!sv)
  3054.     return 0;
  3055.  
  3056.     if (SvGMAGICAL(sv))
  3057.     len = mg_length(sv);
  3058.     else
  3059.     junk = SvPV(sv, len);
  3060.     return len;
  3061. }
  3062.  
  3063. I32
  3064. sv_eq(register SV *str1, register SV *str2)
  3065. {
  3066.     char *pv1;
  3067.     STRLEN cur1;
  3068.     char *pv2;
  3069.     STRLEN cur2;
  3070.  
  3071.     if (!str1) {
  3072.     pv1 = "";
  3073.     cur1 = 0;
  3074.     }
  3075.     else
  3076.     pv1 = SvPV(str1, cur1);
  3077.  
  3078.     if (!str2)
  3079.     return !cur1;
  3080.     else
  3081.     pv2 = SvPV(str2, cur2);
  3082.  
  3083.     if (cur1 != cur2)
  3084.     return 0;
  3085.  
  3086.     return memEQ(pv1, pv2, cur1);
  3087. }
  3088.  
  3089. I32
  3090. sv_cmp(register SV *str1, register SV *str2)
  3091. {
  3092.     STRLEN cur1 = 0;
  3093.     char *pv1 = str1 ? SvPV(str1, cur1) : (char *) NULL;
  3094.     STRLEN cur2 = 0;
  3095.     char *pv2 = str2 ? SvPV(str2, cur2) : (char *) NULL;
  3096.     I32 retval;
  3097.  
  3098.     if (!cur1)
  3099.     return cur2 ? -1 : 0;
  3100.  
  3101.     if (!cur2)
  3102.     return 1;
  3103.  
  3104.     retval = memcmp((void*)pv1, (void*)pv2, cur1 < cur2 ? cur1 : cur2);
  3105.  
  3106.     if (retval)
  3107.     return retval < 0 ? -1 : 1;
  3108.  
  3109.     if (cur1 == cur2)
  3110.     return 0;
  3111.     else
  3112.     return cur1 < cur2 ? -1 : 1;
  3113. }
  3114.  
  3115. I32
  3116. sv_cmp_locale(register SV *sv1, register SV *sv2)
  3117. {
  3118. #ifdef USE_LOCALE_COLLATE
  3119.  
  3120.     char *pv1, *pv2;
  3121.     STRLEN len1, len2;
  3122.     I32 retval;
  3123.  
  3124.     if (PL_collation_standard)
  3125.     goto raw_compare;
  3126.  
  3127.     len1 = 0;
  3128.     pv1 = sv1 ? sv_collxfrm(sv1, &len1) : (char *) NULL;
  3129.     len2 = 0;
  3130.     pv2 = sv2 ? sv_collxfrm(sv2, &len2) : (char *) NULL;
  3131.  
  3132.     if (!pv1 || !len1) {
  3133.     if (pv2 && len2)
  3134.         return -1;
  3135.     else
  3136.         goto raw_compare;
  3137.     }
  3138.     else {
  3139.     if (!pv2 || !len2)
  3140.         return 1;
  3141.     }
  3142.  
  3143.     retval = memcmp((void*)pv1, (void*)pv2, len1 < len2 ? len1 : len2);
  3144.  
  3145.     if (retval)
  3146.     return retval < 0 ? -1 : 1;
  3147.  
  3148.     /*
  3149.      * When the result of collation is equality, that doesn't mean
  3150.      * that there are no differences -- some locales exclude some
  3151.      * characters from consideration.  So to avoid false equalities,
  3152.      * we use the raw string as a tiebreaker.
  3153.      */
  3154.  
  3155.   raw_compare:
  3156.     /* FALL THROUGH */
  3157.  
  3158. #endif /* USE_LOCALE_COLLATE */
  3159.  
  3160.     return sv_cmp(sv1, sv2);
  3161. }
  3162.  
  3163. #ifdef USE_LOCALE_COLLATE
  3164. /*
  3165.  * Any scalar variable may carry an 'o' magic that contains the
  3166.  * scalar data of the variable transformed to such a format that
  3167.  * a normal memory comparison can be used to compare the data
  3168.  * according to the locale settings.
  3169.  */
  3170. char *
  3171. sv_collxfrm(SV *sv, STRLEN *nxp)
  3172. {
  3173.     MAGIC *mg;
  3174.  
  3175.     mg = SvMAGICAL(sv) ? mg_find(sv, 'o') : (MAGIC *) NULL;
  3176.     if (!mg || !mg->mg_ptr || *(U32*)mg->mg_ptr != PL_collation_ix) {
  3177.     char *s, *xf;
  3178.     STRLEN len, xlen;
  3179.  
  3180.     if (mg)
  3181.         Safefree(mg->mg_ptr);
  3182.     s = SvPV(sv, len);
  3183.     if ((xf = mem_collxfrm(s, len, &xlen))) {
  3184.         if (SvREADONLY(sv)) {
  3185.         SAVEFREEPV(xf);
  3186.         *nxp = xlen;
  3187.         return xf + sizeof(PL_collation_ix);
  3188.         }
  3189.         if (! mg) {
  3190.         sv_magic(sv, 0, 'o', 0, 0);
  3191.         mg = mg_find(sv, 'o');
  3192.         assert(mg);
  3193.         }
  3194.         mg->mg_ptr = xf;
  3195.         mg->mg_len = xlen;
  3196.     }
  3197.     else {
  3198.         if (mg) {
  3199.         mg->mg_ptr = NULL;
  3200.         mg->mg_len = -1;
  3201.         }
  3202.     }
  3203.     }
  3204.     if (mg && mg->mg_ptr) {
  3205.     *nxp = mg->mg_len;
  3206.     return mg->mg_ptr + sizeof(PL_collation_ix);
  3207.     }
  3208.     else {
  3209.     *nxp = 0;
  3210.     return NULL;
  3211.     }
  3212. }
  3213.  
  3214. #endif /* USE_LOCALE_COLLATE */
  3215.  
  3216. char *
  3217. sv_gets(register SV *sv, register PerlIO *fp, I32 append)
  3218. {
  3219.     dTHR;
  3220.     char *rsptr;
  3221.     STRLEN rslen;
  3222.     register STDCHAR rslast;
  3223.     register STDCHAR *bp;
  3224.     register I32 cnt;
  3225.     I32 i;
  3226.  
  3227.     SV_CHECK_THINKFIRST(sv);
  3228.     (void)SvUPGRADE(sv, SVt_PV);
  3229.     SvSCREAM_off(sv);
  3230.  
  3231.     if (RsSNARF(PL_rs)) {
  3232.     rsptr = NULL;
  3233.     rslen = 0;
  3234.     }
  3235.     else if (RsRECORD(PL_rs)) {
  3236.       I32 recsize, bytesread;
  3237.       char *buffer;
  3238.  
  3239.       /* Grab the size of the record we're getting */
  3240.       recsize = SvIV(SvRV(PL_rs));
  3241.       (void)SvPOK_only(sv);    /* Validate pointer */
  3242.       buffer = SvGROW(sv, recsize + 1);
  3243.       /* Go yank in */
  3244. #ifdef VMS
  3245.       /* VMS wants read instead of fread, because fread doesn't respect */
  3246.       /* RMS record boundaries. This is not necessarily a good thing to be */
  3247.       /* doing, but we've got no other real choice */
  3248.       bytesread = PerlLIO_read(PerlIO_fileno(fp), buffer, recsize);
  3249. #else
  3250.       bytesread = PerlIO_read(fp, buffer, recsize);
  3251. #endif
  3252.       SvCUR_set(sv, bytesread);
  3253.       buffer[bytesread] = '\0';
  3254.       return(SvCUR(sv) ? SvPVX(sv) : Nullch);
  3255.     }
  3256.     else if (RsPARA(PL_rs)) {
  3257.     rsptr = "\n\n";
  3258.     rslen = 2;
  3259.     }
  3260.     else
  3261.     rsptr = SvPV(PL_rs, rslen);
  3262.     rslast = rslen ? rsptr[rslen - 1] : '\0';
  3263.  
  3264.     if (RsPARA(PL_rs)) {        /* have to do this both before and after */
  3265.     do {            /* to make sure file boundaries work right */
  3266.         if (PerlIO_eof(fp))
  3267.         return 0;
  3268.         i = PerlIO_getc(fp);
  3269.         if (i != '\n') {
  3270.         if (i == -1)
  3271.             return 0;
  3272.         PerlIO_ungetc(fp,i);
  3273.         break;
  3274.         }
  3275.     } while (i != EOF);
  3276.     }
  3277.  
  3278.     /* See if we know enough about I/O mechanism to cheat it ! */
  3279.  
  3280.     /* This used to be #ifdef test - it is made run-time test for ease
  3281.        of abstracting out stdio interface. One call should be cheap 
  3282.        enough here - and may even be a macro allowing compile
  3283.        time optimization.
  3284.      */
  3285.  
  3286.     if (PerlIO_fast_gets(fp)) {
  3287.  
  3288.     /*
  3289.      * We're going to steal some values from the stdio struct
  3290.      * and put EVERYTHING in the innermost loop into registers.
  3291.      */
  3292.     register STDCHAR *ptr;
  3293.     STRLEN bpx;
  3294.     I32 shortbuffered;
  3295.  
  3296. #if defined(VMS) && defined(PERLIO_IS_STDIO)
  3297.     /* An ungetc()d char is handled separately from the regular
  3298.      * buffer, so we getc() it back out and stuff it in the buffer.
  3299.      */
  3300.     i = PerlIO_getc(fp);
  3301.     if (i == EOF) return 0;
  3302.     *(--((*fp)->_ptr)) = (unsigned char) i;
  3303.     (*fp)->_cnt++;
  3304. #endif
  3305.  
  3306.     /* Here is some breathtakingly efficient cheating */
  3307.  
  3308.     cnt = PerlIO_get_cnt(fp);            /* get count into register */
  3309.     (void)SvPOK_only(sv);        /* validate pointer */
  3310.     if (SvLEN(sv) - append <= cnt + 1) { /* make sure we have the room */
  3311.     if (cnt > 80 && SvLEN(sv) > append) {
  3312.         shortbuffered = cnt - SvLEN(sv) + append + 1;
  3313.         cnt -= shortbuffered;
  3314.     }
  3315.     else {
  3316.         shortbuffered = 0;
  3317.         /* remember that cnt can be negative */
  3318.         SvGROW(sv, append + (cnt <= 0 ? 2 : (cnt + 1)));
  3319.     }
  3320.     }
  3321.     else
  3322.     shortbuffered = 0;
  3323.     bp = (STDCHAR*)SvPVX(sv) + append;  /* move these two too to registers */
  3324.     ptr = (STDCHAR*)PerlIO_get_ptr(fp);
  3325.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3326.     "Screamer: entering, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
  3327.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3328.     "Screamer: entering: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
  3329.            (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
  3330.            (long)(PerlIO_has_base(fp) ? PerlIO_get_base(fp) : 0)));
  3331.     for (;;) {
  3332.       screamer:
  3333.     if (cnt > 0) {
  3334.         if (rslen) {
  3335.         while (cnt > 0) {             /* this     |  eat */
  3336.             cnt--;
  3337.             if ((*bp++ = *ptr++) == rslast)  /* really   |  dust */
  3338.             goto thats_all_folks;         /* screams  |  sed :-) */
  3339.         }
  3340.         }
  3341.         else {
  3342.             Copy(ptr, bp, cnt, char);         /* this     |  eat */    
  3343.         bp += cnt;                 /* screams  |  dust */   
  3344.         ptr += cnt;                 /* louder   |  sed :-) */
  3345.         cnt = 0;
  3346.         }
  3347.     }
  3348.     
  3349.     if (shortbuffered) {        /* oh well, must extend */
  3350.         cnt = shortbuffered;
  3351.         shortbuffered = 0;
  3352.         bpx = bp - (STDCHAR*)SvPVX(sv); /* box up before relocation */
  3353.         SvCUR_set(sv, bpx);
  3354.         SvGROW(sv, SvLEN(sv) + append + cnt + 2);
  3355.         bp = (STDCHAR*)SvPVX(sv) + bpx; /* unbox after relocation */
  3356.         continue;
  3357.     }
  3358.  
  3359.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3360.         "Screamer: going to getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
  3361.     PerlIO_set_ptrcnt(fp, ptr, cnt); /* deregisterize cnt and ptr */
  3362.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3363.         "Screamer: pre: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
  3364.         (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
  3365.         (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
  3366.     /* This used to call 'filbuf' in stdio form, but as that behaves like 
  3367.        getc when cnt <= 0 we use PerlIO_getc here to avoid introducing
  3368.        another abstraction.  */
  3369.     i   = PerlIO_getc(fp);        /* get more characters */
  3370.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3371.         "Screamer: post: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
  3372.         (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
  3373.         (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
  3374.     cnt = PerlIO_get_cnt(fp);
  3375.     ptr = (STDCHAR*)PerlIO_get_ptr(fp);    /* reregisterize cnt and ptr */
  3376.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3377.         "Screamer: after getc, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
  3378.  
  3379.     if (i == EOF)            /* all done for ever? */
  3380.         goto thats_really_all_folks;
  3381.  
  3382.     bpx = bp - (STDCHAR*)SvPVX(sv);    /* box up before relocation */
  3383.     SvCUR_set(sv, bpx);
  3384.     SvGROW(sv, bpx + cnt + 2);
  3385.     bp = (STDCHAR*)SvPVX(sv) + bpx;    /* unbox after relocation */
  3386.  
  3387.     *bp++ = i;            /* store character from PerlIO_getc */
  3388.  
  3389.     if (rslen && (STDCHAR)i == rslast)  /* all done for now? */
  3390.         goto thats_all_folks;
  3391.     }
  3392.  
  3393. thats_all_folks:
  3394.     if ((rslen > 1 && (bp - (STDCHAR*)SvPVX(sv) < rslen)) ||
  3395.       memNE((char*)bp - rslen, rsptr, rslen))
  3396.     goto screamer;                /* go back to the fray */
  3397. thats_really_all_folks:
  3398.     if (shortbuffered)
  3399.     cnt += shortbuffered;
  3400.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3401.         "Screamer: quitting, ptr=%ld, cnt=%ld\n",(long)ptr,(long)cnt));
  3402.     PerlIO_set_ptrcnt(fp, ptr, cnt);    /* put these back or we're in trouble */
  3403.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3404.     "Screamer: end: FILE * thinks ptr=%ld, cnt=%ld, base=%ld\n",
  3405.     (long)PerlIO_get_ptr(fp), (long)PerlIO_get_cnt(fp), 
  3406.     (long)(PerlIO_has_base (fp) ? PerlIO_get_base(fp) : 0)));
  3407.     *bp = '\0';
  3408.     SvCUR_set(sv, bp - (STDCHAR*)SvPVX(sv));    /* set length */
  3409.     DEBUG_P(PerlIO_printf(Perl_debug_log,
  3410.     "Screamer: done, len=%ld, string=|%.*s|\n",
  3411.     (long)SvCUR(sv),(int)SvCUR(sv),SvPVX(sv)));
  3412.     }
  3413.    else
  3414.     {
  3415.        /*The big, slow, and stupid way */
  3416.     STDCHAR buf[8192];
  3417.  
  3418. screamer2:
  3419.     if (rslen) {
  3420.         register STDCHAR *bpe = buf + sizeof(buf);
  3421.         bp = buf;
  3422.         while ((i = PerlIO_getc(fp)) != EOF && (*bp++ = i) != rslast && bp < bpe)
  3423.         ; /* keep reading */
  3424.         cnt = bp - buf;
  3425.     }
  3426.     else {
  3427.         cnt = PerlIO_read(fp,(char*)buf, sizeof(buf));
  3428.         /* Accomodate broken VAXC compiler, which applies U8 cast to
  3429.          * both args of ?: operator, causing EOF to change into 255
  3430.          */
  3431.         if (cnt) { i = (U8)buf[cnt - 1]; } else { i = EOF; }
  3432.     }
  3433.  
  3434.     if (append)
  3435.         sv_catpvn(sv, (char *) buf, cnt);
  3436.     else
  3437.         sv_setpvn(sv, (char *) buf, cnt);
  3438.  
  3439.     if (i != EOF &&            /* joy */
  3440.         (!rslen ||
  3441.          SvCUR(sv) < rslen ||
  3442.          memNE(SvPVX(sv) + SvCUR(sv) - rslen, rsptr, rslen)))
  3443.     {
  3444.         append = -1;
  3445.         /*
  3446.          * If we're reading from a TTY and we get a short read,
  3447.          * indicating that the user hit his EOF character, we need
  3448.          * to notice it now, because if we try to read from the TTY
  3449.          * again, the EOF condition will disappear.
  3450.          *
  3451.          * The comparison of cnt to sizeof(buf) is an optimization
  3452.          * that prevents unnecessary calls to feof().
  3453.          *
  3454.          * - jik 9/25/96
  3455.          */
  3456.         if (!(cnt < sizeof(buf) && PerlIO_eof(fp)))
  3457.         goto screamer2;
  3458.     }
  3459.     }
  3460.  
  3461.     if (RsPARA(PL_rs)) {        /* have to do this both before and after */  
  3462.         while (i != EOF) {    /* to make sure file boundaries work right */
  3463.         i = PerlIO_getc(fp);
  3464.         if (i != '\n') {
  3465.         PerlIO_ungetc(fp,i);
  3466.         break;
  3467.         }
  3468.     }
  3469.     }
  3470.  
  3471. #ifdef WIN32
  3472.     win32_strip_return(sv);
  3473. #endif
  3474.  
  3475.     return (SvCUR(sv) - append) ? SvPVX(sv) : Nullch;
  3476. }
  3477.  
  3478.  
  3479. void
  3480. sv_inc(register SV *sv)
  3481. {
  3482.     register char *d;
  3483.     int flags;
  3484.  
  3485.     if (!sv)
  3486.     return;
  3487.     if (SvTHINKFIRST(sv)) {
  3488.     if (SvREADONLY(sv)) {
  3489.         dTHR;
  3490.         if (PL_curcop != &PL_compiling)
  3491.         croak(no_modify);
  3492.     }
  3493.     if (SvROK(sv)) {
  3494.         IV i;
  3495. #ifdef OVERLOAD
  3496.         if (SvAMAGIC(sv) && AMG_CALLun(sv,inc)) return;
  3497. #endif /* OVERLOAD */
  3498.         i = (IV)SvRV(sv);
  3499.         sv_unref(sv);
  3500.         sv_setiv(sv, i);
  3501.     }
  3502.     }
  3503.     if (SvGMAGICAL(sv))
  3504.     mg_get(sv);
  3505.     flags = SvFLAGS(sv);
  3506.     if (flags & SVp_NOK) {
  3507.     (void)SvNOK_only(sv);
  3508.     SvNVX(sv) += 1.0;
  3509.     return;
  3510.     }
  3511.     if (flags & SVp_IOK) {
  3512.     if (SvIVX(sv) == IV_MAX)
  3513.         sv_setnv(sv, (double)IV_MAX + 1.0);
  3514.     else {
  3515.         (void)SvIOK_only(sv);
  3516.         ++SvIVX(sv);
  3517.     }
  3518.     return;
  3519.     }
  3520.     if (!(flags & SVp_POK) || !*SvPVX(sv)) {
  3521.     if ((flags & SVTYPEMASK) < SVt_PVNV)
  3522.         sv_upgrade(sv, SVt_NV);
  3523.     SvNVX(sv) = 1.0;
  3524.     (void)SvNOK_only(sv);
  3525.     return;
  3526.     }
  3527.     d = SvPVX(sv);
  3528.     while (isALPHA(*d)) d++;
  3529.     while (isDIGIT(*d)) d++;
  3530.     if (*d) {
  3531.     SET_NUMERIC_STANDARD();
  3532.     sv_setnv(sv,atof(SvPVX(sv)) + 1.0);  /* punt */
  3533.     return;
  3534.     }
  3535.     d--;
  3536.     while (d >= SvPVX(sv)) {
  3537.     if (isDIGIT(*d)) {
  3538.         if (++*d <= '9')
  3539.         return;
  3540.         *(d--) = '0';
  3541.     }
  3542.     else {
  3543.         ++*d;
  3544.         if (isALPHA(*d))
  3545.         return;
  3546.         *(d--) -= 'z' - 'a' + 1;
  3547.     }
  3548.     }
  3549.     /* oh,oh, the number grew */
  3550.     SvGROW(sv, SvCUR(sv) + 2);
  3551.     SvCUR(sv)++;
  3552.     for (d = SvPVX(sv) + SvCUR(sv); d > SvPVX(sv); d--)
  3553.     *d = d[-1];
  3554.     if (isDIGIT(d[1]))
  3555.     *d = '1';
  3556.     else
  3557.     *d = d[1];
  3558. }
  3559.  
  3560. void
  3561. sv_dec(register SV *sv)
  3562. {
  3563.     int flags;
  3564.  
  3565.     if (!sv)
  3566.     return;
  3567.     if (SvTHINKFIRST(sv)) {
  3568.     if (SvREADONLY(sv)) {
  3569.         dTHR;
  3570.         if (PL_curcop != &PL_compiling)
  3571.         croak(no_modify);
  3572.     }
  3573.     if (SvROK(sv)) {
  3574.         IV i;
  3575. #ifdef OVERLOAD
  3576.         if (SvAMAGIC(sv) && AMG_CALLun(sv,dec)) return;
  3577. #endif /* OVERLOAD */
  3578.         i = (IV)SvRV(sv);
  3579.         sv_unref(sv);
  3580.         sv_setiv(sv, i);
  3581.     }
  3582.     }
  3583.     if (SvGMAGICAL(sv))
  3584.     mg_get(sv);
  3585.     flags = SvFLAGS(sv);
  3586.     if (flags & SVp_NOK) {
  3587.     SvNVX(sv) -= 1.0;
  3588.     (void)SvNOK_only(sv);
  3589.     return;
  3590.     }
  3591.     if (flags & SVp_IOK) {
  3592.     if (SvIVX(sv) == IV_MIN)
  3593.         sv_setnv(sv, (double)IV_MIN - 1.0);
  3594.     else {
  3595.         (void)SvIOK_only(sv);
  3596.         --SvIVX(sv);
  3597.     }
  3598.     return;
  3599.     }
  3600.     if (!(flags & SVp_POK)) {
  3601.     if ((flags & SVTYPEMASK) < SVt_PVNV)
  3602.         sv_upgrade(sv, SVt_NV);
  3603.     SvNVX(sv) = -1.0;
  3604.     (void)SvNOK_only(sv);
  3605.     return;
  3606.     }
  3607.     SET_NUMERIC_STANDARD();
  3608.     sv_setnv(sv,atof(SvPVX(sv)) - 1.0);    /* punt */
  3609. }
  3610.  
  3611. /* Make a string that will exist for the duration of the expression
  3612.  * evaluation.  Actually, it may have to last longer than that, but
  3613.  * hopefully we won't free it until it has been assigned to a
  3614.  * permanent location. */
  3615.  
  3616. STATIC void
  3617. sv_mortalgrow(void)
  3618. {
  3619.     dTHR;
  3620.     PL_tmps_max += (PL_tmps_max < 512) ? 128 : 512;
  3621.     Renew(PL_tmps_stack, PL_tmps_max, SV*);
  3622. }
  3623.  
  3624. SV *
  3625. sv_mortalcopy(SV *oldstr)
  3626. {
  3627.     dTHR;
  3628.     register SV *sv;
  3629.  
  3630.     new_SV(sv);
  3631.     SvANY(sv) = 0;
  3632.     SvREFCNT(sv) = 1;
  3633.     SvFLAGS(sv) = 0;
  3634.     sv_setsv(sv,oldstr);
  3635.     if (++PL_tmps_ix >= PL_tmps_max)
  3636.     sv_mortalgrow();
  3637.     PL_tmps_stack[PL_tmps_ix] = sv;
  3638.     SvTEMP_on(sv);
  3639.     return sv;
  3640. }
  3641.  
  3642. SV *
  3643. sv_newmortal(void)
  3644. {
  3645.     dTHR;
  3646.     register SV *sv;
  3647.  
  3648.     new_SV(sv);
  3649.     SvANY(sv) = 0;
  3650.     SvREFCNT(sv) = 1;
  3651.     SvFLAGS(sv) = SVs_TEMP;
  3652.     if (++PL_tmps_ix >= PL_tmps_max)
  3653.     sv_mortalgrow();
  3654.     PL_tmps_stack[PL_tmps_ix] = sv;
  3655.     return sv;
  3656. }
  3657.  
  3658. /* same thing without the copying */
  3659.  
  3660. SV *
  3661. sv_2mortal(register SV *sv)
  3662. {
  3663.     dTHR;
  3664.     if (!sv)
  3665.     return sv;
  3666.     if (SvREADONLY(sv) && SvIMMORTAL(sv))
  3667.     return sv;
  3668.     if (++PL_tmps_ix >= PL_tmps_max)
  3669.     sv_mortalgrow();
  3670.     PL_tmps_stack[PL_tmps_ix] = sv;
  3671.     SvTEMP_on(sv);
  3672.     return sv;
  3673. }
  3674.  
  3675. SV *
  3676. newSVpv(char *s, STRLEN len)
  3677. {
  3678.     register SV *sv;
  3679.  
  3680.     new_SV(sv);
  3681.     SvANY(sv) = 0;
  3682.     SvREFCNT(sv) = 1;
  3683.     SvFLAGS(sv) = 0;
  3684.     if (!len)
  3685.     len = strlen(s);
  3686.     sv_setpvn(sv,s,len);
  3687.     return sv;
  3688. }
  3689.  
  3690. SV *
  3691. newSVpvn(char *s, STRLEN len)
  3692. {
  3693.     register SV *sv;
  3694.  
  3695.     new_SV(sv);
  3696.     SvANY(sv) = 0;
  3697.     SvREFCNT(sv) = 1;
  3698.     SvFLAGS(sv) = 0;
  3699.     sv_setpvn(sv,s,len);
  3700.     return sv;
  3701. }
  3702.  
  3703. SV *
  3704. newSVpvf(const char* pat, ...)
  3705. {
  3706.     register SV *sv;
  3707.     va_list args;
  3708.  
  3709.     new_SV(sv);
  3710.     SvANY(sv) = 0;
  3711.     SvREFCNT(sv) = 1;
  3712.     SvFLAGS(sv) = 0;
  3713.     va_start(args, pat);
  3714.     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
  3715.     va_end(args);
  3716.     return sv;
  3717. }
  3718.  
  3719.  
  3720. SV *
  3721. newSVnv(double n)
  3722. {
  3723.     register SV *sv;
  3724.  
  3725.     new_SV(sv);
  3726.     SvANY(sv) = 0;
  3727.     SvREFCNT(sv) = 1;
  3728.     SvFLAGS(sv) = 0;
  3729.     sv_setnv(sv,n);
  3730.     return sv;
  3731. }
  3732.  
  3733. SV *
  3734. newSViv(IV i)
  3735. {
  3736.     register SV *sv;
  3737.  
  3738.     new_SV(sv);
  3739.     SvANY(sv) = 0;
  3740.     SvREFCNT(sv) = 1;
  3741.     SvFLAGS(sv) = 0;
  3742.     sv_setiv(sv,i);
  3743.     return sv;
  3744. }
  3745.  
  3746. SV *
  3747. newRV_noinc(SV *tmpRef)
  3748. {
  3749.     dTHR;
  3750.     register SV *sv;
  3751.  
  3752.     new_SV(sv);
  3753.     SvANY(sv) = 0;
  3754.     SvREFCNT(sv) = 1;
  3755.     SvFLAGS(sv) = 0;
  3756.     sv_upgrade(sv, SVt_RV);
  3757.     SvTEMP_off(tmpRef);
  3758.     SvRV(sv) = tmpRef;
  3759.     SvROK_on(sv);
  3760.     return sv;
  3761. }
  3762.  
  3763. SV *
  3764. newRV(SV *tmpRef)
  3765. {
  3766.     return newRV_noinc(SvREFCNT_inc(tmpRef));
  3767. }
  3768.  
  3769. /* make an exact duplicate of old */
  3770.  
  3771. SV *
  3772. newSVsv(register SV *old)
  3773. {
  3774.     register SV *sv;
  3775.  
  3776.     if (!old)
  3777.     return Nullsv;
  3778.     if (SvTYPE(old) == SVTYPEMASK) {
  3779.     warn("semi-panic: attempt to dup freed string");
  3780.     return Nullsv;
  3781.     }
  3782.     new_SV(sv);
  3783.     SvANY(sv) = 0;
  3784.     SvREFCNT(sv) = 1;
  3785.     SvFLAGS(sv) = 0;
  3786.     if (SvTEMP(old)) {
  3787.     SvTEMP_off(old);
  3788.     sv_setsv(sv,old);
  3789.     SvTEMP_on(old);
  3790.     }
  3791.     else
  3792.     sv_setsv(sv,old);
  3793.     return sv;
  3794. }
  3795.  
  3796. void
  3797. sv_reset(register char *s, HV *stash)
  3798. {
  3799.     register HE *entry;
  3800.     register GV *gv;
  3801.     register SV *sv;
  3802.     register I32 i;
  3803.     register PMOP *pm;
  3804.     register I32 max;
  3805.     char todo[256];
  3806.  
  3807.     if (!stash)
  3808.     return;
  3809.  
  3810.     if (!*s) {        /* reset ?? searches */
  3811.     for (pm = HvPMROOT(stash); pm; pm = pm->op_pmnext) {
  3812.         pm->op_pmdynflags &= ~PMdf_USED;
  3813.     }
  3814.     return;
  3815.     }
  3816.  
  3817.     /* reset variables */
  3818.  
  3819.     if (!HvARRAY(stash))
  3820.     return;
  3821.  
  3822.     Zero(todo, 256, char);
  3823.     while (*s) {
  3824.     i = *s;
  3825.     if (s[1] == '-') {
  3826.         s += 2;
  3827.     }
  3828.     max = *s++;
  3829.     for ( ; i <= max; i++) {
  3830.         todo[i] = 1;
  3831.     }
  3832.     for (i = 0; i <= (I32) HvMAX(stash); i++) {
  3833.         for (entry = HvARRAY(stash)[i];
  3834.           entry;
  3835.           entry = HeNEXT(entry)) {
  3836.         if (!todo[(U8)*HeKEY(entry)])
  3837.             continue;
  3838.         gv = (GV*)HeVAL(entry);
  3839.         sv = GvSV(gv);
  3840.         (void)SvOK_off(sv);
  3841.         if (SvTYPE(sv) >= SVt_PV) {
  3842.             SvCUR_set(sv, 0);
  3843.             if (SvPVX(sv) != Nullch)
  3844.             *SvPVX(sv) = '\0';
  3845.             SvTAINT(sv);
  3846.         }
  3847.         if (GvAV(gv)) {
  3848.             av_clear(GvAV(gv));
  3849.         }
  3850.         if (GvHV(gv) && !HvNAME(GvHV(gv))) {
  3851.             hv_clear(GvHV(gv));
  3852. #ifndef VMS  /* VMS has no environ array */
  3853.             if (gv == PL_envgv)
  3854.             environ[0] = Nullch;
  3855. #endif
  3856.         }
  3857.         }
  3858.     }
  3859.     }
  3860. }
  3861.  
  3862. IO*
  3863. sv_2io(SV *sv)
  3864. {
  3865.     IO* io;
  3866.     GV* gv;
  3867.  
  3868.     switch (SvTYPE(sv)) {
  3869.     case SVt_PVIO:
  3870.     io = (IO*)sv;
  3871.     break;
  3872.     case SVt_PVGV:
  3873.     gv = (GV*)sv;
  3874.     io = GvIO(gv);
  3875.     if (!io)
  3876.         croak("Bad filehandle: %s", GvNAME(gv));
  3877.     break;
  3878.     default:
  3879.     if (!SvOK(sv))
  3880.         croak(no_usym, "filehandle");
  3881.     if (SvROK(sv))
  3882.         return sv_2io(SvRV(sv));
  3883.     gv = gv_fetchpv(SvPV(sv,PL_na), FALSE, SVt_PVIO);
  3884.     if (gv)
  3885.         io = GvIO(gv);
  3886.     else
  3887.         io = 0;
  3888.     if (!io)
  3889.         croak("Bad filehandle: %s", SvPV(sv,PL_na));
  3890.     break;
  3891.     }
  3892.     return io;
  3893. }
  3894.  
  3895. CV *
  3896. sv_2cv(SV *sv, HV **st, GV **gvp, I32 lref)
  3897. {
  3898.     GV *gv;
  3899.     CV *cv;
  3900.  
  3901.     if (!sv)
  3902.     return *gvp = Nullgv, Nullcv;
  3903.     switch (SvTYPE(sv)) {
  3904.     case SVt_PVCV:
  3905.     *st = CvSTASH(sv);
  3906.     *gvp = Nullgv;
  3907.     return (CV*)sv;
  3908.     case SVt_PVHV:
  3909.     case SVt_PVAV:
  3910.     *gvp = Nullgv;
  3911.     return Nullcv;
  3912.     case SVt_PVGV:
  3913.     gv = (GV*)sv;
  3914.     *gvp = gv;
  3915.     *st = GvESTASH(gv);
  3916.     goto fix_gv;
  3917.  
  3918.     default:
  3919.     if (SvGMAGICAL(sv))
  3920.         mg_get(sv);
  3921.     if (SvROK(sv)) {
  3922.         cv = (CV*)SvRV(sv);
  3923.         if (SvTYPE(cv) != SVt_PVCV)
  3924.         croak("Not a subroutine reference");
  3925.         *gvp = Nullgv;
  3926.         *st = CvSTASH(cv);
  3927.         return cv;
  3928.     }
  3929.     if (isGV(sv))
  3930.         gv = (GV*)sv;
  3931.     else
  3932.         gv = gv_fetchpv(SvPV(sv, PL_na), lref, SVt_PVCV);
  3933.     *gvp = gv;
  3934.     if (!gv)
  3935.         return Nullcv;
  3936.     *st = GvESTASH(gv);
  3937.     fix_gv:
  3938.     if (lref && !GvCVu(gv)) {
  3939.         SV *tmpsv;
  3940.         ENTER;
  3941.         tmpsv = NEWSV(704,0);
  3942.         gv_efullname3(tmpsv, gv, Nullch);
  3943.         newSUB(start_subparse(FALSE, 0),
  3944.            newSVOP(OP_CONST, 0, tmpsv),
  3945.            Nullop,
  3946.            Nullop);
  3947.         LEAVE;
  3948.         if (!GvCVu(gv))
  3949.         croak("Unable to create sub named \"%s\"", SvPV(sv,PL_na));
  3950.     }
  3951.     return GvCVu(gv);
  3952.     }
  3953. }
  3954.  
  3955. I32
  3956. sv_true(register SV *sv)
  3957. {
  3958.     dTHR;
  3959.     if (!sv)
  3960.     return 0;
  3961.     if (SvPOK(sv)) {
  3962.     register XPV* tXpv;
  3963.     if ((tXpv = (XPV*)SvANY(sv)) &&
  3964.         (*tXpv->xpv_pv > '0' ||
  3965.         tXpv->xpv_cur > 1 ||
  3966.         (tXpv->xpv_cur && *tXpv->xpv_pv != '0')))
  3967.         return 1;
  3968.     else
  3969.         return 0;
  3970.     }
  3971.     else {
  3972.     if (SvIOK(sv))
  3973.         return SvIVX(sv) != 0;
  3974.     else {
  3975.         if (SvNOK(sv))
  3976.         return SvNVX(sv) != 0.0;
  3977.         else
  3978.         return sv_2bool(sv);
  3979.     }
  3980.     }
  3981. }
  3982.  
  3983. IV
  3984. sv_iv(register SV *sv)
  3985. {
  3986.     if (SvIOK(sv))
  3987.     return SvIVX(sv);
  3988.     return sv_2iv(sv);
  3989. }
  3990.  
  3991. UV
  3992. sv_uv(register SV *sv)
  3993. {
  3994.     if (SvIOK(sv))
  3995.     return SvUVX(sv);
  3996.     return sv_2uv(sv);
  3997. }
  3998.  
  3999. double
  4000. sv_nv(register SV *sv)
  4001. {
  4002.     if (SvNOK(sv))
  4003.     return SvNVX(sv);
  4004.     return sv_2nv(sv);
  4005. }
  4006.  
  4007. char *
  4008. sv_pvn(SV *sv, STRLEN *lp)
  4009. {
  4010.     if (SvPOK(sv)) {
  4011.     *lp = SvCUR(sv);
  4012.     return SvPVX(sv);
  4013.     }
  4014.     return sv_2pv(sv, lp);
  4015. }
  4016.  
  4017. char *
  4018. sv_pvn_force(SV *sv, STRLEN *lp)
  4019. {
  4020.     char *s;
  4021.  
  4022.     if (SvREADONLY(sv)) {
  4023.     dTHR;
  4024.     if (PL_curcop != &PL_compiling)
  4025.         croak(no_modify);
  4026.     }
  4027.     
  4028.     if (SvPOK(sv)) {
  4029.     *lp = SvCUR(sv);
  4030.     }
  4031.     else {
  4032.     if (SvTYPE(sv) > SVt_PVLV && SvTYPE(sv) != SVt_PVFM) {
  4033.         if (SvFAKE(sv) && SvTYPE(sv) == SVt_PVGV) {
  4034.         sv_unglob(sv);
  4035.         s = SvPVX(sv);
  4036.         *lp = SvCUR(sv);
  4037.         }
  4038.         else {
  4039.         dTHR;
  4040.         croak("Can't coerce %s to string in %s", sv_reftype(sv,0),
  4041.             op_name[PL_op->op_type]);
  4042.         }
  4043.     }
  4044.     else
  4045.         s = sv_2pv(sv, lp);
  4046.     if (s != SvPVX(sv)) {    /* Almost, but not quite, sv_setpvn() */
  4047.         STRLEN len = *lp;
  4048.         
  4049.         if (SvROK(sv))
  4050.         sv_unref(sv);
  4051.         (void)SvUPGRADE(sv, SVt_PV);        /* Never FALSE */
  4052.         SvGROW(sv, len + 1);
  4053.         Move(s,SvPVX(sv),len,char);
  4054.         SvCUR_set(sv, len);
  4055.         *SvEND(sv) = '\0';
  4056.     }
  4057.     if (!SvPOK(sv)) {
  4058.         SvPOK_on(sv);        /* validate pointer */
  4059.         SvTAINT(sv);
  4060.         DEBUG_c(PerlIO_printf(Perl_debug_log, "0x%lx 2pv(%s)\n",
  4061.         (unsigned long)sv,SvPVX(sv)));
  4062.     }
  4063.     }
  4064.     return SvPVX(sv);
  4065. }
  4066.  
  4067. char *
  4068. sv_reftype(SV *sv, int ob)
  4069. {
  4070.     if (ob && SvOBJECT(sv))
  4071.     return HvNAME(SvSTASH(sv));
  4072.     else {
  4073.     switch (SvTYPE(sv)) {
  4074.     case SVt_NULL:
  4075.     case SVt_IV:
  4076.     case SVt_NV:
  4077.     case SVt_RV:
  4078.     case SVt_PV:
  4079.     case SVt_PVIV:
  4080.     case SVt_PVNV:
  4081.     case SVt_PVMG:
  4082.     case SVt_PVBM:
  4083.                 if (SvROK(sv))
  4084.                     return "REF";
  4085.                 else
  4086.                     return "SCALAR";
  4087.     case SVt_PVLV:        return "LVALUE";
  4088.     case SVt_PVAV:        return "ARRAY";
  4089.     case SVt_PVHV:        return "HASH";
  4090.     case SVt_PVCV:        return "CODE";
  4091.     case SVt_PVGV:        return "GLOB";
  4092.     case SVt_PVFM:        return "FORMAT";
  4093.     default:        return "UNKNOWN";
  4094.     }
  4095.     }
  4096. }
  4097.  
  4098. int
  4099. sv_isobject(SV *sv)
  4100. {
  4101.     if (!sv)
  4102.     return 0;
  4103.     if (SvGMAGICAL(sv))
  4104.     mg_get(sv);
  4105.     if (!SvROK(sv))
  4106.     return 0;
  4107.     sv = (SV*)SvRV(sv);
  4108.     if (!SvOBJECT(sv))
  4109.     return 0;
  4110.     return 1;
  4111. }
  4112.  
  4113. int
  4114. sv_isa(SV *sv, char *name)
  4115. {
  4116.     if (!sv)
  4117.     return 0;
  4118.     if (SvGMAGICAL(sv))
  4119.     mg_get(sv);
  4120.     if (!SvROK(sv))
  4121.     return 0;
  4122.     sv = (SV*)SvRV(sv);
  4123.     if (!SvOBJECT(sv))
  4124.     return 0;
  4125.  
  4126.     return strEQ(HvNAME(SvSTASH(sv)), name);
  4127. }
  4128.  
  4129. SV*
  4130. newSVrv(SV *rv, char *classname)
  4131. {
  4132.     dTHR;
  4133.     SV *sv;
  4134.  
  4135.     new_SV(sv);
  4136.     SvANY(sv) = 0;
  4137.     SvREFCNT(sv) = 0;
  4138.     SvFLAGS(sv) = 0;
  4139.  
  4140.     SV_CHECK_THINKFIRST(rv);
  4141. #ifdef OVERLOAD
  4142.     SvAMAGIC_off(rv);
  4143. #endif /* OVERLOAD */
  4144.  
  4145.     if (SvTYPE(rv) < SVt_RV)
  4146.       sv_upgrade(rv, SVt_RV);
  4147.  
  4148.     (void)SvOK_off(rv);
  4149.     SvRV(rv) = SvREFCNT_inc(sv);
  4150.     SvROK_on(rv);
  4151.  
  4152.     if (classname) {
  4153.     HV* stash = gv_stashpv(classname, TRUE);
  4154.     (void)sv_bless(rv, stash);
  4155.     }
  4156.     return sv;
  4157. }
  4158.  
  4159. SV*
  4160. sv_setref_pv(SV *rv, char *classname, void *pv)
  4161. {
  4162.     if (!pv) {
  4163.     sv_setsv(rv, &PL_sv_undef);
  4164.     SvSETMAGIC(rv);
  4165.     }
  4166.     else
  4167.     sv_setiv(newSVrv(rv,classname), (IV)pv);
  4168.     return rv;
  4169. }
  4170.  
  4171. SV*
  4172. sv_setref_iv(SV *rv, char *classname, IV iv)
  4173. {
  4174.     sv_setiv(newSVrv(rv,classname), iv);
  4175.     return rv;
  4176. }
  4177.  
  4178. SV*
  4179. sv_setref_nv(SV *rv, char *classname, double nv)
  4180. {
  4181.     sv_setnv(newSVrv(rv,classname), nv);
  4182.     return rv;
  4183. }
  4184.  
  4185. SV*
  4186. sv_setref_pvn(SV *rv, char *classname, char *pv, I32 n)
  4187. {
  4188.     sv_setpvn(newSVrv(rv,classname), pv, n);
  4189.     return rv;
  4190. }
  4191.  
  4192. SV*
  4193. sv_bless(SV *sv, HV *stash)
  4194. {
  4195.     dTHR;
  4196.     SV *tmpRef;
  4197.     if (!SvROK(sv))
  4198.         croak("Can't bless non-reference value");
  4199.     tmpRef = SvRV(sv);
  4200.     if (SvFLAGS(tmpRef) & (SVs_OBJECT|SVf_READONLY)) {
  4201.     if (SvREADONLY(tmpRef))
  4202.         croak(no_modify);
  4203.     if (SvOBJECT(tmpRef)) {
  4204.         if (SvTYPE(tmpRef) != SVt_PVIO)
  4205.         --PL_sv_objcount;
  4206.         SvREFCNT_dec(SvSTASH(tmpRef));
  4207.     }
  4208.     }
  4209.     SvOBJECT_on(tmpRef);
  4210.     if (SvTYPE(tmpRef) != SVt_PVIO)
  4211.     ++PL_sv_objcount;
  4212.     (void)SvUPGRADE(tmpRef, SVt_PVMG);
  4213.     SvSTASH(tmpRef) = (HV*)SvREFCNT_inc(stash);
  4214.  
  4215. #ifdef OVERLOAD
  4216.     if (Gv_AMG(stash))
  4217.     SvAMAGIC_on(sv);
  4218.     else
  4219.     SvAMAGIC_off(sv);
  4220. #endif /* OVERLOAD */
  4221.  
  4222.     return sv;
  4223. }
  4224.  
  4225. STATIC void
  4226. sv_unglob(SV *sv)
  4227. {
  4228.     assert(SvTYPE(sv) == SVt_PVGV);
  4229.     SvFAKE_off(sv);
  4230.     if (GvGP(sv))
  4231.     gp_free((GV*)sv);
  4232.     if (GvSTASH(sv)) {
  4233.     SvREFCNT_dec(GvSTASH(sv));
  4234.     GvSTASH(sv) = Nullhv;
  4235.     }
  4236.     sv_unmagic(sv, '*');
  4237.     Safefree(GvNAME(sv));
  4238.     GvMULTI_off(sv);
  4239.     SvFLAGS(sv) &= ~SVTYPEMASK;
  4240.     SvFLAGS(sv) |= SVt_PVMG;
  4241. }
  4242.  
  4243. void
  4244. sv_unref(SV *sv)
  4245. {
  4246.     SV* rv = SvRV(sv);
  4247.     
  4248.     SvRV(sv) = 0;
  4249.     SvROK_off(sv);
  4250.     if (SvREFCNT(rv) != 1 || SvREADONLY(rv))
  4251.     SvREFCNT_dec(rv);
  4252.     else
  4253.     sv_2mortal(rv);        /* Schedule for freeing later */
  4254. }
  4255.  
  4256. void
  4257. sv_taint(SV *sv)
  4258. {
  4259.     sv_magic((sv), Nullsv, 't', Nullch, 0);
  4260. }
  4261.  
  4262. void
  4263. sv_untaint(SV *sv)
  4264. {
  4265.     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
  4266.     MAGIC *mg = mg_find(sv, 't');
  4267.     if (mg)
  4268.         mg->mg_len &= ~1;
  4269.     }
  4270. }
  4271.  
  4272. bool
  4273. sv_tainted(SV *sv)
  4274. {
  4275.     if (SvTYPE(sv) >= SVt_PVMG && SvMAGIC(sv)) {
  4276.     MAGIC *mg = mg_find(sv, 't');
  4277.     if (mg && ((mg->mg_len & 1) || (mg->mg_len & 2) && mg->mg_obj == sv))
  4278.         return TRUE;
  4279.     }
  4280.     return FALSE;
  4281. }
  4282.  
  4283. void
  4284. sv_setpviv(SV *sv, IV iv)
  4285. {
  4286.     STRLEN len;
  4287.     char buf[TYPE_DIGITS(UV)];
  4288.     char *ptr = buf + sizeof(buf);
  4289.     int sign;
  4290.     UV uv;
  4291.     char *p;
  4292.  
  4293.     sv_setpvn(sv, "", 0);
  4294.     if (iv >= 0) {
  4295.     uv = iv;
  4296.     sign = 0;
  4297.     } else {
  4298.     uv = -iv;
  4299.     sign = 1;
  4300.     }
  4301.     do {
  4302.     *--ptr = '0' + (uv % 10);
  4303.     } while (uv /= 10);
  4304.     len = (buf + sizeof(buf)) - ptr;
  4305.     /* taking advantage of SvCUR(sv) == 0 */
  4306.     SvGROW(sv, sign + len + 1);
  4307.     p = SvPVX(sv);
  4308.     if (sign)
  4309.     *p++ = '-';
  4310.     memcpy(p, ptr, len);
  4311.     p += len;
  4312.     *p = '\0';
  4313.     SvCUR(sv) = p - SvPVX(sv);
  4314. }
  4315.  
  4316.  
  4317. void
  4318. sv_setpviv_mg(SV *sv, IV iv)
  4319. {
  4320.     sv_setpviv(sv,iv);
  4321.     SvSETMAGIC(sv);
  4322. }
  4323.  
  4324. void
  4325. sv_setpvf(SV *sv, const char* pat, ...)
  4326. {
  4327.     va_list args;
  4328.     va_start(args, pat);
  4329.     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
  4330.     va_end(args);
  4331. }
  4332.  
  4333.  
  4334. void
  4335. sv_setpvf_mg(SV *sv, const char* pat, ...)
  4336. {
  4337.     va_list args;
  4338.     va_start(args, pat);
  4339.     sv_vsetpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
  4340.     va_end(args);
  4341.     SvSETMAGIC(sv);
  4342. }
  4343.  
  4344. void
  4345. sv_catpvf(SV *sv, const char* pat, ...)
  4346. {
  4347.     va_list args;
  4348.     va_start(args, pat);
  4349.     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
  4350.     va_end(args);
  4351. }
  4352.  
  4353. void
  4354. sv_catpvf_mg(SV *sv, const char* pat, ...)
  4355. {
  4356.     va_list args;
  4357.     va_start(args, pat);
  4358.     sv_vcatpvfn(sv, pat, strlen(pat), &args, Null(SV**), 0, Null(bool*));
  4359.     va_end(args);
  4360.     SvSETMAGIC(sv);
  4361. }
  4362.  
  4363. void
  4364. sv_vsetpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
  4365. {
  4366.     sv_setpvn(sv, "", 0);
  4367.     sv_vcatpvfn(sv, pat, patlen, args, svargs, svmax, used_locale);
  4368. }
  4369.  
  4370. void
  4371. sv_vcatpvfn(SV *sv, const char *pat, STRLEN patlen, va_list *args, SV **svargs, I32 svmax, bool *used_locale)
  4372. {
  4373.     dTHR;
  4374.     char *p;
  4375.     char *q;
  4376.     char *patend;
  4377.     STRLEN origlen;
  4378.     I32 svix = 0;
  4379.     static char nullstr[] = "(null)";
  4380.  
  4381.     /* no matter what, this is a string now */
  4382.     (void)SvPV_force(sv, origlen);
  4383.  
  4384.     /* special-case "", "%s", and "%_" */
  4385.     if (patlen == 0)
  4386.     return;
  4387.     if (patlen == 2 && pat[0] == '%') {
  4388.     switch (pat[1]) {
  4389.     case 's':
  4390.         if (args) {
  4391.         char *s = va_arg(*args, char*);
  4392.         sv_catpv(sv, s ? s : nullstr);
  4393.         }
  4394.         else if (svix < svmax)
  4395.         sv_catsv(sv, *svargs);
  4396.         return;
  4397.     case '_':
  4398.         if (args) {
  4399.         sv_catsv(sv, va_arg(*args, SV*));
  4400.         return;
  4401.         }
  4402.         /* See comment on '_' below */
  4403.         break;
  4404.     }
  4405.     }
  4406.  
  4407.     patend = (char*)pat + patlen;
  4408.     for (p = (char*)pat; p < patend; p = q) {
  4409.     bool alt = FALSE;
  4410.     bool left = FALSE;
  4411.     char fill = ' ';
  4412.     char plus = 0;
  4413.     char intsize = 0;
  4414.     STRLEN width = 0;
  4415.     STRLEN zeros = 0;
  4416.     bool has_precis = FALSE;
  4417.     STRLEN precis = 0;
  4418.  
  4419.     char esignbuf[4];
  4420.     STRLEN esignlen = 0;
  4421.  
  4422.     char *eptr = Nullch;
  4423.     STRLEN elen = 0;
  4424.     char ebuf[TYPE_DIGITS(int) * 2 + 16]; /* large enough for "%#.#f" */
  4425.  
  4426.     static char *efloatbuf = Nullch;
  4427.     static STRLEN efloatsize = 0;
  4428.  
  4429.     char c;
  4430.     int i;
  4431.     unsigned base;
  4432.     IV iv;
  4433.     UV uv;
  4434.     double nv;
  4435.     STRLEN have;
  4436.     STRLEN need;
  4437.     STRLEN gap;
  4438.  
  4439.     for (q = p; q < patend && *q != '%'; ++q) ;
  4440.     if (q > p) {
  4441.         sv_catpvn(sv, p, q - p);
  4442.         p = q;
  4443.     }
  4444.     if (q++ >= patend)
  4445.         break;
  4446.  
  4447.     /* FLAGS */
  4448.  
  4449.     while (*q) {
  4450.         switch (*q) {
  4451.         case ' ':
  4452.         case '+':
  4453.         plus = *q++;
  4454.         continue;
  4455.  
  4456.         case '-':
  4457.         left = TRUE;
  4458.         q++;
  4459.         continue;
  4460.  
  4461.         case '0':
  4462.         fill = *q++;
  4463.         continue;
  4464.  
  4465.         case '#':
  4466.         alt = TRUE;
  4467.         q++;
  4468.         continue;
  4469.  
  4470.         default:
  4471.         break;
  4472.         }
  4473.         break;
  4474.     }
  4475.  
  4476.     /* WIDTH */
  4477.  
  4478.     switch (*q) {
  4479.     case '1': case '2': case '3':
  4480.     case '4': case '5': case '6':
  4481.     case '7': case '8': case '9':
  4482.         width = 0;
  4483.         while (isDIGIT(*q))
  4484.         width = width * 10 + (*q++ - '0');
  4485.         break;
  4486.  
  4487.     case '*':
  4488.         if (args)
  4489.         i = va_arg(*args, int);
  4490.         else
  4491.         i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
  4492.         left |= (i < 0);
  4493.         width = (i < 0) ? -i : i;
  4494.         q++;
  4495.         break;
  4496.     }
  4497.  
  4498.     /* PRECISION */
  4499.  
  4500.     if (*q == '.') {
  4501.         q++;
  4502.         if (*q == '*') {
  4503.         if (args)
  4504.             i = va_arg(*args, int);
  4505.         else
  4506.             i = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
  4507.         precis = (i < 0) ? 0 : i;
  4508.         q++;
  4509.         }
  4510.         else {
  4511.         precis = 0;
  4512.         while (isDIGIT(*q))
  4513.             precis = precis * 10 + (*q++ - '0');
  4514.         }
  4515.         has_precis = TRUE;
  4516.     }
  4517.  
  4518.     /* SIZE */
  4519.  
  4520.     switch (*q) {
  4521.     case 'l':
  4522. #if 0  /* when quads have better support within Perl */
  4523.         if (*(q + 1) == 'l') {
  4524.         intsize = 'q';
  4525.         q += 2;
  4526.         break;
  4527.         }
  4528. #endif
  4529.         /* FALL THROUGH */
  4530.     case 'h':
  4531.     case 'V':
  4532.         intsize = *q++;
  4533.         break;
  4534.     }
  4535.  
  4536.     /* CONVERSION */
  4537.  
  4538.     switch (c = *q++) {
  4539.  
  4540.         /* STRINGS */
  4541.  
  4542.     case '%':
  4543.         eptr = q - 1;
  4544.         elen = 1;
  4545.         goto string;
  4546.  
  4547.     case 'c':
  4548.         if (args)
  4549.         c = va_arg(*args, int);
  4550.         else
  4551.         c = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
  4552.         eptr = &c;
  4553.         elen = 1;
  4554.         goto string;
  4555.  
  4556.     case 's':
  4557.         if (args) {
  4558.         eptr = va_arg(*args, char*);
  4559.         if (eptr)
  4560.             elen = strlen(eptr);
  4561.         else {
  4562.             eptr = nullstr;
  4563.             elen = sizeof nullstr - 1;
  4564.         }
  4565.         }
  4566.         else if (svix < svmax)
  4567.         eptr = SvPVx(svargs[svix++], elen);
  4568.         goto string;
  4569.  
  4570.     case '_':
  4571.         /*
  4572.          * The "%_" hack might have to be changed someday,
  4573.          * if ISO or ANSI decide to use '_' for something.
  4574.          * So we keep it hidden from users' code.
  4575.          */
  4576.         if (!args)
  4577.         goto unknown;
  4578.         eptr = SvPVx(va_arg(*args, SV*), elen);
  4579.  
  4580.     string:
  4581.         if (has_precis && elen > precis)
  4582.         elen = precis;
  4583.         break;
  4584.  
  4585.         /* INTEGERS */
  4586.  
  4587.     case 'p':
  4588.         if (args)
  4589.         uv = (UV)va_arg(*args, void*);
  4590.         else
  4591.         uv = (svix < svmax) ? (UV)svargs[svix++] : 0;
  4592.         base = 16;
  4593.         goto integer;
  4594.  
  4595.     case 'D':
  4596.         intsize = 'l';
  4597.         /* FALL THROUGH */
  4598.     case 'd':
  4599.     case 'i':
  4600.         if (args) {
  4601.         switch (intsize) {
  4602.         case 'h':    iv = (short)va_arg(*args, int); break;
  4603.         default:    iv = va_arg(*args, int); break;
  4604.         case 'l':    iv = va_arg(*args, long); break;
  4605.         case 'V':    iv = va_arg(*args, IV); break;
  4606.         }
  4607.         }
  4608.         else {
  4609.         iv = (svix < svmax) ? SvIVx(svargs[svix++]) : 0;
  4610.         switch (intsize) {
  4611.         case 'h':    iv = (short)iv; break;
  4612.         default:    iv = (int)iv; break;
  4613.         case 'l':    iv = (long)iv; break;
  4614.         case 'V':    break;
  4615.         }
  4616.         }
  4617.         if (iv >= 0) {
  4618.         uv = iv;
  4619.         if (plus)
  4620.             esignbuf[esignlen++] = plus;
  4621.         }
  4622.         else {
  4623.         uv = -iv;
  4624.         esignbuf[esignlen++] = '-';
  4625.         }
  4626.         base = 10;
  4627.         goto integer;
  4628.  
  4629.     case 'U':
  4630.         intsize = 'l';
  4631.         /* FALL THROUGH */
  4632.     case 'u':
  4633.         base = 10;
  4634.         goto uns_integer;
  4635.  
  4636.     case 'O':
  4637.         intsize = 'l';
  4638.         /* FALL THROUGH */
  4639.     case 'o':
  4640.         base = 8;
  4641.         goto uns_integer;
  4642.  
  4643.     case 'X':
  4644.     case 'x':
  4645.         base = 16;
  4646.  
  4647.     uns_integer:
  4648.         if (args) {
  4649.         switch (intsize) {
  4650.         case 'h':  uv = (unsigned short)va_arg(*args, unsigned); break;
  4651.         default:   uv = va_arg(*args, unsigned); break;
  4652.         case 'l':  uv = va_arg(*args, unsigned long); break;
  4653.         case 'V':  uv = va_arg(*args, UV); break;
  4654.         }
  4655.         }
  4656.         else {
  4657.         uv = (svix < svmax) ? SvUVx(svargs[svix++]) : 0;
  4658.         switch (intsize) {
  4659.         case 'h':    uv = (unsigned short)uv; break;
  4660.         default:    uv = (unsigned)uv; break;
  4661.         case 'l':    uv = (unsigned long)uv; break;
  4662.         case 'V':    break;
  4663.         }
  4664.         }
  4665.  
  4666.     integer:
  4667.         eptr = ebuf + sizeof ebuf;
  4668.         switch (base) {
  4669.         unsigned dig;
  4670.         case 16:
  4671.         if (!uv)
  4672.             alt = FALSE;
  4673.         p = (c == 'X') ? "0123456789ABCDEF" : "0123456789abcdef";
  4674.         do {
  4675.             dig = uv & 15;
  4676.             *--eptr = p[dig];
  4677.         } while (uv >>= 4);
  4678.         if (alt) {
  4679.             esignbuf[esignlen++] = '0';
  4680.             esignbuf[esignlen++] = c;  /* 'x' or 'X' */
  4681.         }
  4682.         break;
  4683.         case 8:
  4684.         do {
  4685.             dig = uv & 7;
  4686.             *--eptr = '0' + dig;
  4687.         } while (uv >>= 3);
  4688.         if (alt && *eptr != '0')
  4689.             *--eptr = '0';
  4690.         break;
  4691.         default:        /* it had better be ten or less */
  4692.         do {
  4693.             dig = uv % base;
  4694.             *--eptr = '0' + dig;
  4695.         } while (uv /= base);
  4696.         break;
  4697.         }
  4698.         elen = (ebuf + sizeof ebuf) - eptr;
  4699.         if (has_precis) {
  4700.         if (precis > elen)
  4701.             zeros = precis - elen;
  4702.         else if (precis == 0 && elen == 1 && *eptr == '0')
  4703.             elen = 0;
  4704.         }
  4705.         break;
  4706.  
  4707.         /* FLOATING POINT */
  4708.  
  4709.     case 'F':
  4710.         c = 'f';        /* maybe %F isn't supported here */
  4711.         /* FALL THROUGH */
  4712.     case 'e': case 'E':
  4713.     case 'f':
  4714.     case 'g': case 'G':
  4715.  
  4716.         /* This is evil, but floating point is even more evil */
  4717.  
  4718.         if (args)
  4719.         nv = va_arg(*args, double);
  4720.         else
  4721.         nv = (svix < svmax) ? SvNVx(svargs[svix++]) : 0.0;
  4722.  
  4723.         need = 0;
  4724.         if (c != 'e' && c != 'E') {
  4725.         i = PERL_INT_MIN;
  4726.         (void)frexp(nv, &i);
  4727.         if (i == PERL_INT_MIN)
  4728.             die("panic: frexp");
  4729.         if (i > 0)
  4730.             need = BIT_DIGITS(i);
  4731.         }
  4732.         need += has_precis ? precis : 6; /* known default */
  4733.         if (need < width)
  4734.         need = width;
  4735.  
  4736.         need += 20; /* fudge factor */
  4737.         if (efloatsize < need) {
  4738.         Safefree(efloatbuf);
  4739.         efloatsize = need + 20; /* more fudge */
  4740.         New(906, efloatbuf, efloatsize, char);
  4741.         }
  4742.  
  4743.         eptr = ebuf + sizeof ebuf;
  4744.         *--eptr = '\0';
  4745.         *--eptr = c;
  4746.         if (has_precis) {
  4747.         base = precis;
  4748.         do { *--eptr = '0' + (base % 10); } while (base /= 10);
  4749.         *--eptr = '.';
  4750.         }
  4751.         if (width) {
  4752.         base = width;
  4753.         do { *--eptr = '0' + (base % 10); } while (base /= 10);
  4754.         }
  4755.         if (fill == '0')
  4756.         *--eptr = fill;
  4757.         if (left)
  4758.         *--eptr = '-';
  4759.         if (plus)
  4760.         *--eptr = plus;
  4761.         if (alt)
  4762.         *--eptr = '#';
  4763.         *--eptr = '%';
  4764.  
  4765.         (void)sprintf(efloatbuf, eptr, nv);
  4766.  
  4767.         eptr = efloatbuf;
  4768.         elen = strlen(efloatbuf);
  4769.  
  4770. #ifdef LC_NUMERIC
  4771.         /*
  4772.          * User-defined locales may include arbitrary characters.
  4773.          * And, unfortunately, some system may alloc the "C" locale
  4774.          * to be overridden by a malicious user.
  4775.          */
  4776.         if (used_locale)
  4777.         *used_locale = TRUE;
  4778. #endif /* LC_NUMERIC */
  4779.  
  4780.         break;
  4781.  
  4782.         /* SPECIAL */
  4783.  
  4784.     case 'n':
  4785.         i = SvCUR(sv) - origlen;
  4786.         if (args) {
  4787.         switch (intsize) {
  4788.         case 'h':    *(va_arg(*args, short*)) = i; break;
  4789.         default:    *(va_arg(*args, int*)) = i; break;
  4790.         case 'l':    *(va_arg(*args, long*)) = i; break;
  4791.         case 'V':    *(va_arg(*args, IV*)) = i; break;
  4792.         }
  4793.         }
  4794.         else if (svix < svmax)
  4795.         sv_setuv(svargs[svix++], (UV)i);
  4796.         continue;    /* not "break" */
  4797.  
  4798.         /* UNKNOWN */
  4799.  
  4800.     default:
  4801.       unknown:
  4802.         if (!args && PL_dowarn &&
  4803.           (PL_op->op_type == OP_PRTF || PL_op->op_type == OP_SPRINTF)) {
  4804.         SV *msg = sv_newmortal();
  4805.         sv_setpvf(msg, "Invalid conversion in %s: ",
  4806.               (PL_op->op_type == OP_PRTF) ? "printf" : "sprintf");
  4807.         if (c)
  4808.             sv_catpvf(msg, isPRINT(c) ? "\"%%%c\"" : "\"%%\\%03o\"",
  4809.                   c & 0xFF);
  4810.         else
  4811.             sv_catpv(msg, "end of string");
  4812.         warn("%_", msg); /* yes, this is reentrant */
  4813.         }
  4814.  
  4815.         /* output mangled stuff ... */
  4816.         if (c == '\0')
  4817.         --q;
  4818.         eptr = p;
  4819.         elen = q - p;
  4820.  
  4821.         /* ... right here, because formatting flags should not apply */
  4822.         SvGROW(sv, SvCUR(sv) + elen + 1);
  4823.         p = SvEND(sv);
  4824.         memcpy(p, eptr, elen);
  4825.         p += elen;
  4826.         *p = '\0';
  4827.         SvCUR(sv) = p - SvPVX(sv);
  4828.         continue;    /* not "break" */
  4829.     }
  4830.  
  4831.     have = esignlen + zeros + elen;
  4832.     need = (have > width ? have : width);
  4833.     gap = need - have;
  4834.  
  4835.     SvGROW(sv, SvCUR(sv) + need + 1);
  4836.     p = SvEND(sv);
  4837.     if (esignlen && fill == '0') {
  4838.         for (i = 0; i < esignlen; i++)
  4839.         *p++ = esignbuf[i];
  4840.     }
  4841.     if (gap && !left) {
  4842.         memset(p, fill, gap);
  4843.         p += gap;
  4844.     }
  4845.     if (esignlen && fill != '0') {
  4846.         for (i = 0; i < esignlen; i++)
  4847.         *p++ = esignbuf[i];
  4848.     }
  4849.     if (zeros) {
  4850.         for (i = zeros; i; i--)
  4851.         *p++ = '0';
  4852.     }
  4853.     if (elen) {
  4854.         memcpy(p, eptr, elen);
  4855.         p += elen;
  4856.     }
  4857.     if (gap && left) {
  4858.         memset(p, ' ', gap);
  4859.         p += gap;
  4860.     }
  4861.     *p = '\0';
  4862.     SvCUR(sv) = p - SvPVX(sv);
  4863.     }
  4864. }
  4865.  
  4866. void
  4867. sv_dump(SV *sv)
  4868. {
  4869. #ifdef DEBUGGING
  4870.     SV *d = sv_newmortal();
  4871.     char *s;
  4872.     U32 flags;
  4873.     U32 type;
  4874.  
  4875.     if (!sv) {
  4876.     PerlIO_printf(Perl_debug_log, "SV = 0\n");
  4877.     return;
  4878.     }
  4879.     
  4880.     flags = SvFLAGS(sv);
  4881.     type = SvTYPE(sv);
  4882.  
  4883.     sv_setpvf(d, "(0x%lx)\n  REFCNT = %ld\n  FLAGS = (",
  4884.           (unsigned long)SvANY(sv), (long)SvREFCNT(sv));
  4885.     if (flags & SVs_PADBUSY)    sv_catpv(d, "PADBUSY,");
  4886.     if (flags & SVs_PADTMP)    sv_catpv(d, "PADTMP,");
  4887.     if (flags & SVs_PADMY)    sv_catpv(d, "PADMY,");
  4888.     if (flags & SVs_TEMP)    sv_catpv(d, "TEMP,");
  4889.     if (flags & SVs_OBJECT)    sv_catpv(d, "OBJECT,");
  4890.     if (flags & SVs_GMG)    sv_catpv(d, "GMG,");
  4891.     if (flags & SVs_SMG)    sv_catpv(d, "SMG,");
  4892.     if (flags & SVs_RMG)    sv_catpv(d, "RMG,");
  4893.  
  4894.     if (flags & SVf_IOK)    sv_catpv(d, "IOK,");
  4895.     if (flags & SVf_NOK)    sv_catpv(d, "NOK,");
  4896.     if (flags & SVf_POK)    sv_catpv(d, "POK,");
  4897.     if (flags & SVf_ROK)    sv_catpv(d, "ROK,");
  4898.     if (flags & SVf_OOK)    sv_catpv(d, "OOK,");
  4899.     if (flags & SVf_FAKE)    sv_catpv(d, "FAKE,");
  4900.     if (flags & SVf_READONLY)    sv_catpv(d, "READONLY,");
  4901.  
  4902. #ifdef OVERLOAD
  4903.     if (flags & SVf_AMAGIC)    sv_catpv(d, "OVERLOAD,");
  4904. #endif /* OVERLOAD */
  4905.     if (flags & SVp_IOK)    sv_catpv(d, "pIOK,");
  4906.     if (flags & SVp_NOK)    sv_catpv(d, "pNOK,");
  4907.     if (flags & SVp_POK)    sv_catpv(d, "pPOK,");
  4908.     if (flags & SVp_SCREAM)    sv_catpv(d, "SCREAM,");
  4909.  
  4910.     switch (type) {
  4911.     case SVt_PVCV:
  4912.     case SVt_PVFM:
  4913.     if (CvANON(sv))        sv_catpv(d, "ANON,");
  4914.     if (CvUNIQUE(sv))    sv_catpv(d, "UNIQUE,");
  4915.     if (CvCLONE(sv))    sv_catpv(d, "CLONE,");
  4916.     if (CvCLONED(sv))    sv_catpv(d, "CLONED,");
  4917.     if (CvNODEBUG(sv))    sv_catpv(d, "NODEBUG,");
  4918.     break;
  4919.     case SVt_PVHV:
  4920.     if (HvSHAREKEYS(sv))    sv_catpv(d, "SHAREKEYS,");
  4921.     if (HvLAZYDEL(sv))    sv_catpv(d, "LAZYDEL,");
  4922.     break;
  4923.     case SVt_PVGV:
  4924.     if (GvINTRO(sv))    sv_catpv(d, "INTRO,");
  4925.     if (GvMULTI(sv))    sv_catpv(d, "MULTI,");
  4926.     if (GvASSUMECV(sv))    sv_catpv(d, "ASSUMECV,");
  4927.     if (GvIMPORTED(sv)) {
  4928.         sv_catpv(d, "IMPORT");
  4929.         if (GvIMPORTED(sv) == GVf_IMPORTED)
  4930.         sv_catpv(d, "ALL,");
  4931.         else {
  4932.         sv_catpv(d, "(");
  4933.         if (GvIMPORTED_SV(sv))    sv_catpv(d, " SV");
  4934.         if (GvIMPORTED_AV(sv))    sv_catpv(d, " AV");
  4935.         if (GvIMPORTED_HV(sv))    sv_catpv(d, " HV");
  4936.         if (GvIMPORTED_CV(sv))    sv_catpv(d, " CV");
  4937.         sv_catpv(d, " ),");
  4938.         }
  4939.     }
  4940.     case SVt_PVBM:
  4941.     if (SvTAIL(sv))    sv_catpv(d, "TAIL,");
  4942.     if (SvCOMPILED(sv))    sv_catpv(d, "COMPILED,");
  4943.     break;
  4944.     }
  4945.  
  4946.     if (*(SvEND(d) - 1) == ',')
  4947.     SvPVX(d)[--SvCUR(d)] = '\0';
  4948.     sv_catpv(d, ")");
  4949.     s = SvPVX(d);
  4950.  
  4951.     PerlIO_printf(Perl_debug_log, "SV = ");
  4952.     switch (type) {
  4953.     case SVt_NULL:
  4954.     PerlIO_printf(Perl_debug_log, "NULL%s\n", s);
  4955.     return;
  4956.     case SVt_IV:
  4957.     PerlIO_printf(Perl_debug_log, "IV%s\n", s);
  4958.     break;
  4959.     case SVt_NV:
  4960.     PerlIO_printf(Perl_debug_log, "NV%s\n", s);
  4961.     break;
  4962.     case SVt_RV:
  4963.     PerlIO_printf(Perl_debug_log, "RV%s\n", s);
  4964.     break;
  4965.     case SVt_PV:
  4966.     PerlIO_printf(Perl_debug_log, "PV%s\n", s);
  4967.     break;
  4968.     case SVt_PVIV:
  4969.     PerlIO_printf(Perl_debug_log, "PVIV%s\n", s);
  4970.     break;
  4971.     case SVt_PVNV:
  4972.     PerlIO_printf(Perl_debug_log, "PVNV%s\n", s);
  4973.     break;
  4974.     case SVt_PVBM:
  4975.     PerlIO_printf(Perl_debug_log, "PVBM%s\n", s);
  4976.     break;
  4977.     case SVt_PVMG:
  4978.     PerlIO_printf(Perl_debug_log, "PVMG%s\n", s);
  4979.     break;
  4980.     case SVt_PVLV:
  4981.     PerlIO_printf(Perl_debug_log, "PVLV%s\n", s);
  4982.     break;
  4983.     case SVt_PVAV:
  4984.     PerlIO_printf(Perl_debug_log, "PVAV%s\n", s);
  4985.     break;
  4986.     case SVt_PVHV:
  4987.     PerlIO_printf(Perl_debug_log, "PVHV%s\n", s);
  4988.     break;
  4989.     case SVt_PVCV:
  4990.     PerlIO_printf(Perl_debug_log, "PVCV%s\n", s);
  4991.     break;
  4992.     case SVt_PVGV:
  4993.     PerlIO_printf(Perl_debug_log, "PVGV%s\n", s);
  4994.     break;
  4995.     case SVt_PVFM:
  4996.     PerlIO_printf(Perl_debug_log, "PVFM%s\n", s);
  4997.     break;
  4998.     case SVt_PVIO:
  4999.     PerlIO_printf(Perl_debug_log, "PVIO%s\n", s);
  5000.     break;
  5001.     default:
  5002.     PerlIO_printf(Perl_debug_log, "UNKNOWN%s\n", s);
  5003.     return;
  5004.     }
  5005.     if (type >= SVt_PVIV || type == SVt_IV)
  5006.     PerlIO_printf(Perl_debug_log, "  IV = %ld\n", (long)SvIVX(sv));
  5007.     if (type >= SVt_PVNV || type == SVt_NV) {
  5008.     SET_NUMERIC_STANDARD();
  5009.     PerlIO_printf(Perl_debug_log, "  NV = %.*g\n", DBL_DIG, SvNVX(sv));
  5010.     }
  5011.     if (SvROK(sv)) {
  5012.     PerlIO_printf(Perl_debug_log, "  RV = 0x%lx\n", (long)SvRV(sv));
  5013.     sv_dump(SvRV(sv));
  5014.     return;
  5015.     }
  5016.     if (type < SVt_PV)
  5017.     return;
  5018.     if (type <= SVt_PVLV) {
  5019.     if (SvPVX(sv))
  5020.         PerlIO_printf(Perl_debug_log, "  PV = 0x%lx \"%s\"\n  CUR = %ld\n  LEN = %ld\n",
  5021.         (long)SvPVX(sv), SvPVX(sv), (long)SvCUR(sv), (long)SvLEN(sv));
  5022.     else
  5023.         PerlIO_printf(Perl_debug_log, "  PV = 0\n");
  5024.     }
  5025.     if (type >= SVt_PVMG) {
  5026.     if (SvMAGIC(sv)) {
  5027.         PerlIO_printf(Perl_debug_log, "  MAGIC = 0x%lx\n", (long)SvMAGIC(sv));
  5028.     }
  5029.     if (SvSTASH(sv))
  5030.         PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n", HvNAME(SvSTASH(sv)));
  5031.     }
  5032.     switch (type) {
  5033.     case SVt_PVLV:
  5034.     PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", LvTYPE(sv));
  5035.     PerlIO_printf(Perl_debug_log, "  TARGOFF = %ld\n", (long)LvTARGOFF(sv));
  5036.     PerlIO_printf(Perl_debug_log, "  TARGLEN = %ld\n", (long)LvTARGLEN(sv));
  5037.     PerlIO_printf(Perl_debug_log, "  TARG = 0x%lx\n", (long)LvTARG(sv));
  5038.     sv_dump(LvTARG(sv));
  5039.     break;
  5040.     case SVt_PVAV:
  5041.     PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n", (long)AvARRAY(sv));
  5042.     PerlIO_printf(Perl_debug_log, "  ALLOC = 0x%lx\n", (long)AvALLOC(sv));
  5043.     PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)AvFILLp(sv));
  5044.     PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)AvMAX(sv));
  5045.     PerlIO_printf(Perl_debug_log, "  ARYLEN = 0x%lx\n", (long)AvARYLEN(sv));
  5046.     flags = AvFLAGS(sv);
  5047.     sv_setpv(d, "");
  5048.     if (flags & AVf_REAL)    sv_catpv(d, ",REAL");
  5049.     if (flags & AVf_REIFY)    sv_catpv(d, ",REIFY");
  5050.     if (flags & AVf_REUSED)    sv_catpv(d, ",REUSED");
  5051.     PerlIO_printf(Perl_debug_log, "  FLAGS = (%s)\n",
  5052.               SvCUR(d) ? SvPVX(d) + 1 : "");
  5053.     break;
  5054.     case SVt_PVHV:
  5055.     PerlIO_printf(Perl_debug_log, "  ARRAY = 0x%lx\n",(long)HvARRAY(sv));
  5056.     PerlIO_printf(Perl_debug_log, "  KEYS = %ld\n", (long)HvKEYS(sv));
  5057.     PerlIO_printf(Perl_debug_log, "  FILL = %ld\n", (long)HvFILL(sv));
  5058.     PerlIO_printf(Perl_debug_log, "  MAX = %ld\n", (long)HvMAX(sv));
  5059.     PerlIO_printf(Perl_debug_log, "  RITER = %ld\n", (long)HvRITER(sv));
  5060.     PerlIO_printf(Perl_debug_log, "  EITER = 0x%lx\n",(long) HvEITER(sv));
  5061.     if (HvPMROOT(sv))
  5062.         PerlIO_printf(Perl_debug_log, "  PMROOT = 0x%lx\n",(long)HvPMROOT(sv));
  5063.     if (HvNAME(sv))
  5064.         PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", HvNAME(sv));
  5065.     break;
  5066.     case SVt_PVCV:
  5067.     if (SvPOK(sv))
  5068.         PerlIO_printf(Perl_debug_log, "  PROTOTYPE = \"%s\"\n", SvPV(sv,PL_na));
  5069.     /* FALL THROUGH */
  5070.     case SVt_PVFM:
  5071.     PerlIO_printf(Perl_debug_log, "  STASH = 0x%lx\n", (long)CvSTASH(sv));
  5072.     PerlIO_printf(Perl_debug_log, "  START = 0x%lx\n", (long)CvSTART(sv));
  5073.     PerlIO_printf(Perl_debug_log, "  ROOT = 0x%lx\n", (long)CvROOT(sv));
  5074.     PerlIO_printf(Perl_debug_log, "  XSUB = 0x%lx\n", (long)CvXSUB(sv));
  5075.     PerlIO_printf(Perl_debug_log, "  XSUBANY = %ld\n", (long)CvXSUBANY(sv).any_i32);
  5076.     PerlIO_printf(Perl_debug_log, "  GV = 0x%lx", (long)CvGV(sv));
  5077.     if (CvGV(sv) && GvNAME(CvGV(sv))) {
  5078.         PerlIO_printf(Perl_debug_log, "  \"%s\"\n", GvNAME(CvGV(sv)));
  5079.     } else {
  5080.         PerlIO_printf(Perl_debug_log, "\n");
  5081.     }
  5082.     PerlIO_printf(Perl_debug_log, "  FILEGV = 0x%lx\n", (long)CvFILEGV(sv));
  5083.     PerlIO_printf(Perl_debug_log, "  DEPTH = %ld\n", (long)CvDEPTH(sv));
  5084.     PerlIO_printf(Perl_debug_log, "  PADLIST = 0x%lx\n", (long)CvPADLIST(sv));
  5085.     PerlIO_printf(Perl_debug_log, "  OUTSIDE = 0x%lx\n", (long)CvOUTSIDE(sv));
  5086. #ifdef USE_THREADS
  5087.     PerlIO_printf(Perl_debug_log, "  MUTEXP = 0x%lx\n", (long)CvMUTEXP(sv));
  5088.     PerlIO_printf(Perl_debug_log, "  OWNER = 0x%lx\n", (long)CvOWNER(sv));
  5089. #endif /* USE_THREADS */
  5090.     PerlIO_printf(Perl_debug_log, "  FLAGS = 0x%lx\n",
  5091.               (unsigned long)CvFLAGS(sv));
  5092.     if (type == SVt_PVFM)
  5093.         PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)FmLINES(sv));
  5094.     break;
  5095.     case SVt_PVGV:
  5096.     PerlIO_printf(Perl_debug_log, "  NAME = \"%s\"\n", GvNAME(sv));
  5097.     PerlIO_printf(Perl_debug_log, "  NAMELEN = %ld\n", (long)GvNAMELEN(sv));
  5098.     PerlIO_printf(Perl_debug_log, "  STASH = \"%s\"\n",
  5099.         SvTYPE(GvSTASH(sv)) == SVt_PVHV ? HvNAME(GvSTASH(sv)) : "(deleted)");
  5100.     PerlIO_printf(Perl_debug_log, "  GP = 0x%lx\n", (long)GvGP(sv));
  5101.     PerlIO_printf(Perl_debug_log, "    SV = 0x%lx\n", (long)GvSV(sv));
  5102.     PerlIO_printf(Perl_debug_log, "    REFCNT = %ld\n", (long)GvREFCNT(sv));
  5103.     PerlIO_printf(Perl_debug_log, "    IO = 0x%lx\n", (long)GvIOp(sv));
  5104.     PerlIO_printf(Perl_debug_log, "    FORM = 0x%lx\n", (long)GvFORM(sv));
  5105.     PerlIO_printf(Perl_debug_log, "    AV = 0x%lx\n", (long)GvAV(sv));
  5106.     PerlIO_printf(Perl_debug_log, "    HV = 0x%lx\n", (long)GvHV(sv));
  5107.     PerlIO_printf(Perl_debug_log, "    CV = 0x%lx\n", (long)GvCV(sv));
  5108.     PerlIO_printf(Perl_debug_log, "    CVGEN = 0x%lx\n", (long)GvCVGEN(sv));
  5109.     PerlIO_printf(Perl_debug_log, "    LASTEXPR = %ld\n", (long)GvLASTEXPR(sv));
  5110.     PerlIO_printf(Perl_debug_log, "    LINE = %ld\n", (long)GvLINE(sv));
  5111.     PerlIO_printf(Perl_debug_log, "    FILEGV = 0x%lx\n", (long)GvFILEGV(sv));
  5112.     PerlIO_printf(Perl_debug_log, "    EGV = 0x%lx\n", (long)GvEGV(sv));
  5113.     break;
  5114.     case SVt_PVIO:
  5115.     PerlIO_printf(Perl_debug_log, "  IFP = 0x%lx\n", (long)IoIFP(sv));
  5116.     PerlIO_printf(Perl_debug_log, "  OFP = 0x%lx\n", (long)IoOFP(sv));
  5117.     PerlIO_printf(Perl_debug_log, "  DIRP = 0x%lx\n", (long)IoDIRP(sv));
  5118.     PerlIO_printf(Perl_debug_log, "  LINES = %ld\n", (long)IoLINES(sv));
  5119.     PerlIO_printf(Perl_debug_log, "  PAGE = %ld\n", (long)IoPAGE(sv));
  5120.     PerlIO_printf(Perl_debug_log, "  PAGE_LEN = %ld\n", (long)IoPAGE_LEN(sv));
  5121.     PerlIO_printf(Perl_debug_log, "  LINES_LEFT = %ld\n", (long)IoLINES_LEFT(sv));
  5122.     PerlIO_printf(Perl_debug_log, "  TOP_NAME = \"%s\"\n", IoTOP_NAME(sv));
  5123.     PerlIO_printf(Perl_debug_log, "  TOP_GV = 0x%lx\n", (long)IoTOP_GV(sv));
  5124.     PerlIO_printf(Perl_debug_log, "  FMT_NAME = \"%s\"\n", IoFMT_NAME(sv));
  5125.     PerlIO_printf(Perl_debug_log, "  FMT_GV = 0x%lx\n", (long)IoFMT_GV(sv));
  5126.     PerlIO_printf(Perl_debug_log, "  BOTTOM_NAME = \"%s\"\n", IoBOTTOM_NAME(sv));
  5127.     PerlIO_printf(Perl_debug_log, "  BOTTOM_GV = 0x%lx\n", (long)IoBOTTOM_GV(sv));
  5128.     PerlIO_printf(Perl_debug_log, "  SUBPROCESS = %ld\n", (long)IoSUBPROCESS(sv));
  5129.     PerlIO_printf(Perl_debug_log, "  TYPE = %c\n", IoTYPE(sv));
  5130.     PerlIO_printf(Perl_debug_log, "  FLAGS = 0x%lx\n", (long)IoFLAGS(sv));
  5131.     break;
  5132.     }
  5133. #endif    /* DEBUGGING */
  5134. }
  5135.